魔兽争霸3游戏改键原理

GitHub - dejavud/war3key: War3Key is a hotkey utility for Warcraft III.

GitHub上的程序源代码,别人写的,我只是看代码分析他的实现原理并分享,希望小白能看懂。

      首先要了解没有改键的时候,键盘消息是怎样到游戏进程的。当在玩游戏的时候,点击一个键盘按键,会产出一个键盘消息,此键盘消息进入系统消息队列,系统会将此键盘消息派发给当前活动窗口。当前活动窗口是游戏进程的,所以此消息离开系统队列,进入游戏窗口消息队列。游戏自己的消息处理函数会处理各种键盘消息,从而产生相应的动作。比如按w释放某技能,按小键盘1使用相应的物品栏。

     上面分享的这个改键程序实现的功能是改物品栏的按键。因为小键盘太远不方便。现在想按z按键,实现按小键盘1的效果。将z和1的键值码放入map容器绑定非常容易实现。当按下z的时候,把这个键盘消息替换为小键盘1,再传递给游戏窗口队列,需求就能实现。

    实现的方法不只一种,上面的这个程序的实现是通过注册一个全局键盘钩子,

::SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);

这个全局键盘钩子可以截获系统队列里所有的键盘消息,截获到之后会在自定义的LowLevelKeyboardProc回调函数里进行处理。处理的逻辑是,如果当前活动窗口不是游戏窗口,则进行默认的消息处理,这样消息会被系统派发给当前活动的其它窗口,从而不影响其它进程。如果是war3的窗口,则判断此键盘消息的键值码是否是z的键值码,如果是,则通过代码产生一个虚拟按键事件,如果不是,则也进行默认的消息处理。

::keybd_event(destKey, scanCode, 0, 0);
::keybd_event(destKey, scanCode, KEYEVENTF_KEYUP, 0);

destKey为小键盘1的键值码。而按z产生的键盘消息则丢弃,不让它被派发给游戏进程。虚拟键盘事件也同按了键盘一样,会在系统消息队列产生新的小键盘1的键盘消息,然后此消息又会被全局钩子捕获到,但它此时不是z了,默认不处理派发给游戏窗口。至此,本来按z产生的键盘消息,变成了按1产生的键盘消息,被放入游戏窗口队列,被游戏窗口的消息处理函数处理,从而实现了改键。

      以上是改键原理的核心点,其它细节感兴趣可自行研究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值