为什么游戏中c keybd event_event函数 没有用

问题: Keybd_Event为什么在游戏中模拟按键失效了??求解!
前因:这段时间小弟玩《三国群英传三》打到三国归魏。因为难度太高,所以在网下查了密技。可是每次要敲击一串字符,故想写一个类拟于按键精灵的东西简化输入。例如,开启游戏Debug-后输入ods3on。加钱-输入money99999。我想做成按F1模拟ods3on,F2模拟money99999.
思路:做一个全局键盘勾子。当在游戏中勾到F1时,用Keybd_Event模拟键盘按下ods3on。当勾到F2时,用用Keybd_Event模拟键盘按下money99999.
问题:完成代码后,在记事本,IE地址栏都可以成功实现按下F1显示ods3on,接下F2显示money99999。可在《三国群英传三》游戏中使用无效。
相关代码:
&&SysUtils,
&&Classes,
&&WinTypes,
&&WinProcs,
&&IsHooked:&B
&&HookHandle:&HH
function&HookProc(nCode:&&wParam:&WPARAM;&lParam:&LPARAM):&LRESULT;&
&&if&(nCode&&&-1)&then
&&&&if&(wParam&=&VK_F1)&then
&&&&&&if&((lParam&shr&31)&=1)&then
&&&&&&begin
&&&&&&&&Keybd_Event(Ord('O'),&MapVirtualKey(Ord('O'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('O'),&MapVirtualKey(Ord('O'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&Keybd_Event(Ord('D'),&MapVirtualKey(Ord('D'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('D'),&MapVirtualKey(Ord('D'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&Keybd_Event(Ord('S'),&MapVirtualKey(Ord('S'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('S'),&MapVirtualKey(Ord('S'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&Keybd_Event(Ord('3'),&MapVirtualKey(Ord('3'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('3'),&MapVirtualKey(Ord('3'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&Keybd_Event(Ord('O'),&MapVirtualKey(Ord('O'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('O'),&MapVirtualKey(Ord('O'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&Keybd_Event(Ord('N'),&MapVirtualKey(Ord('N'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('N'),&MapVirtualKey(Ord('N'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&//MessageBeep(0);
&&&&&&Result&:=&1;
&&&&end//打开密技
else&if&(wParam&=&VK_F2)&then
&&&&&&if&((lParam&shr&31)&=1)&then
&&&&&&begin
&&&&&&&&Keybd_Event(Ord('M'),&MapVirtualKey(Ord('M'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('M'),&MapVirtualKey(Ord('M'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&Keybd_Event(Ord('O'),&MapVirtualKey(Ord('O'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('O'),&MapVirtualKey(Ord('O'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&Keybd_Event(Ord('N'),&MapVirtualKey(Ord('N'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('N'),&MapVirtualKey(Ord('N'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&Keybd_Event(Ord('E'),&MapVirtualKey(Ord('E'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('E'),&MapVirtualKey(Ord('E'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&Keybd_Event(Ord('Y'),&MapVirtualKey(Ord('Y'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('Y'),&MapVirtualKey(Ord('Y'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&Keybd_Event(Ord('9'),&MapVirtualKey(Ord('9'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('9'),&MapVirtualKey(Ord('9'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&Keybd_Event(Ord('9'),&MapVirtualKey(Ord('9'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('9'),&MapVirtualKey(Ord('9'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&Keybd_Event(Ord('9'),&MapVirtualKey(Ord('9'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('9'),&MapVirtualKey(Ord('9'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&Keybd_Event(Ord('9'),&MapVirtualKey(Ord('9'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('9'),&MapVirtualKey(Ord('9'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&Keybd_Event(Ord('9'),&MapVirtualKey(Ord('9'),0),&0,0);
&&&&&&&&Keybd_Event(Ord('9'),&MapVirtualKey(Ord('9'),0),&KEYEVENTF_KEYUP,0);
&&&&&&&&//MessageBeep(0);
&&&&&&Result&:=&1;
&&&&end//每城钱财加99999
&&&&Result&:=&0;
&&&&Result&:=&CallNextHookEx(HookHandle,&nCode,&wParam,&lParam);
function&SetHook:&B&
&&Result&:=&F
&&if&IsHooked&then
&&HookHandle&:=&SetWindowsHookEx(WH_KEYBOARD,&HookProc,&HInstance,&0);
&&Result&:=&HookHandle&&&&0;
function&RemoveHook:&B&
&&Result&:=&F
&&if&(not&IsHooked)&and&(HookHandle&&&0)&then
&&&&Result&:=&UnHookWindowsHookEx(HookHandle);
&&IsHooked&:=&F
&&SetHook&name&'SetHook',
&&RemoveHook&name&'RemoveHook',
&&HookProc&name&'HookProc';
&&IsHooked&:=&F
{sanguo3.exe}
unit&sanguo3
function&SetH&external&'sg.dll'&name&'SetHook';
function&RemoveH&external&'sg.dll'&name&'RemoveHook';
procedure&TForm1.Button1Click(Sender:&TObject);
&&if&SetHook&then
&&&&Caption&:=&'三国密技-启动'
&&else&Caption&:=&'三国密技-启动失败'
procedure&TForm1.Button2Click(Sender:&TObject);
&&if&RemoveHook&then
&&&&Caption&:=&'三国密技-关闭'
&&else&Caption&:=&'三国密技-关闭失败'
...解决方案1:
楼主 你的问题解决了么?我最近遇到了与你同样的问题 希望能向你请教下:)
QQ 397681150
MSN forever_
解决方案2:
如果只是为了达到这样的功能直接用“按键精灵”就可以完成了啊。
如果是为了讨论编程那另当别论。
解决方案3:
游戏开发用的不是MFC也不是VCL,SO,游戏一般都是自己开发的一些东西。
所以你得找出这个游戏是如何处理键盘操作的
解决方案4:
游戏采用DirectInput技术
Keybd_Event是不行的!!
所以需要驱动级别下的IO口的键盘模拟!
以上介绍了“ Keybd_Event为什么在游戏中模拟按键失效了??求解!”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:/itwd/3583060.html
上一篇: 下一篇:2011年10月 其他开发语言大版内专家分月排行榜第三2010年8月 其他开发语言大版内专家分月排行榜第三2007年5月 其他开发语言大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。windows开发(64)
原文链接:
今天发现在游戏中,keybd_event不能使用,结果发现游戏是使用directinput实现读取键盘的,关键还是扫描码的问题,我抄了一段老外的代码,经测试有效(在金庸中测试重复输入空格):
#include &iostream&
#include &windows.h&
// for key pushing
BYTE scan_code(DWORD pKey)
&&& const DWORD result = MapVirtualKey(pKey, MAPVK_VK_TO_VSC);
&&& return static_cast&BYTE&(result);
void press_key(DWORD pKey)
&&& keybd_event(static_cast&BYTE&(pKey), scan_code(pKey), 0, 0);
void release_key(DWORD pKey)
&&& keybd_event(static_cast&BYTE&(pKey), scan_code(pKey), KEYEVENTF_KEYUP, 0);
// for testing
#define PRESS(x) press_key(x); std::cout && &Press: & #x && std::endl
#define RELEASE(x) release_key(x); std::cout && &Release: & #x && std::endl
int main(void)
&&& for (;;)
&&&&&&& PRESS(VK_LEFT);
&&&&&&& Sleep(10); // hold it for 1/100'th of a second
&&&&&&& RELEASE(VK_LEFT);
&&&&&&& Sleep(1000); // wait for a second
&&&&&&& PRESS(VK_RIGHT);
&&&&&&& Sleep(10); // hold it for 1/100'th of a second
&&&&&&& RELEASE(VK_RIGHT);
&&&&&&& Sleep(1000); // wait for a second

&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:100421次
积分:1362
积分:1362
排名:千里之外
原创:19篇
转载:122篇
(1)(8)(1)(1)(2)(2)(5)(1)(2)(1)(9)(5)(5)(4)(1)(5)(2)(2)(2)(2)(4)(3)(6)(3)(1)(1)(3)(3)(3)(1)(1)(3)(3)(1)(1)(2)(5)(1)(3)(3)(1)(2)(2)(3)(5)(1)(1)(2)(2)(10)1024人阅读
Python开发(8)
pywin32是python调用win32完成windows系统功能调用的第三方库,实质就是调用的win32,so这个方案也可以解决C++的相同问题。
为什么keybd_event在notepad++等普通软件上可用而游戏中不行
& [为什么keybd_event在notepad++等普通软件上可用而游戏中不行]
所以解决方案就是把keybd_event的第二个参数(通常是0)改为该键对应的扫描码.
扫描码表见& [链接]
然后就可以愉快的用python写cs1.6的外挂了=。=
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:29025次
排名:千里之外
原创:53篇
(1)(1)(1)(1)(7)(1)(3)(2)(18)(3)(5)(2)(7)(1)}

我要回帖

更多关于 keybd event msdn 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信