首页
论坛
课程
招聘
[原创]魔兽争霸改键工具(附源码),仅以此讨论Hook基础技术
2009-11-13 00:14 16316

[原创]魔兽争霸改键工具(附源码),仅以此讨论Hook基础技术

2009-11-13 00:14
16316
--------------------------------------------------------------------------------------------------------
【文章标题】: 魔兽争霸改键工具(附源码),仅以此讨论Hook基础技术
【文章链接】: http://bbs.pediy.com/showthread.php?t=101149
【文章作者】: 乖宝宝~
【作者QQ号】: 124272113
【编写语言】: VC++
【使用工具】: VC++6.0
【操作平台】: Microsoft Windows XP
【软件介绍】: 魔兽争霸改键工具
【作者声明】: 仅以此讨论Hook基础技术,失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
Windows核心编程里面说到钩子必须用DLL来是实现(第五版 第19章的章节简介)。原话是这样的:Windows提供的某些特性只有DLL才能使用。例如,我们可以(通过使用SetWindowsHookEx和SetWinEventHook来)安装某些挂钩函数,但前提条件是必须将挂钩通知函数存放在DLL中。但是我写的这个就没有用到DLL,就一个单独应用程序,但是功能上应该没有问题的。难道书上说的不对?求大牛赐教。。。
本来认为这个应该很Easy,就用简单的全局钩子就能解决问题,可是真的做起来还是遇到不少问题的,首先分析下功能
1.简单的显血功能
开始我模拟按ALT键,可是问题来了,点鼠标左键就相当于发信号了,还有按A键就修改敌方和我方的小兵的颜色,这样显然不行。后来才知道常按'[' ']'这俩键分别是显示我方血条和敌方血条。汗!玩了这么多年真3还真不知道这俩键还有这功能,在CSND上找了一个帖子,里面介绍的这俩显血键,因此我们可以模拟键盘消息来显血,显血功能暂时就这样解决了。
2.简单的改键功能
在回调函数里面做一个“小动作”,具体代码如下
//我用的是更底层的 WH_KEYBOARD_LL 这样可以屏蔽WIN键盘
SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)KeyboardProc,hins,0);
//回调函数的主要代码
LRESULT __declspec(dllexport)__stdcall   CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
   if(HC_ACTION==nCode)
   {
     KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;
    if (pStruct->vkCode == 'A')
    {  
       //wParam = 256是指按下一个键
       if (wParam == 256)
      {
         keybd_event('B', MapVirtualKey('B', 0), 0, 0);//键下键                              
      }
       //wParam = 256是指松开一个键
      if (wParam == 257)
     {
         keybd_event('B', MapVirtualKey('B', 0), KEYEVENTF_KEYUP, 0);//放开键。
     } 
     return TRUE;
  }
}
   LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );   
   return   RetVal;
}

这样实现的功能是将A改键成为B,即按A的时候出现B
3.自动识别聊天状态
这个是最核心的功能,就是当玩家聊天的时候就不要改键了,如果不做处理会影响玩家聊天
定义一个全局的变量 BOOL g_bChatting = FALSE;初始化为未聊天状态,当游戏处于聊天状态的时候我们就修改它。
我们知道我们聊天的时候是先按下 Enter键一次  然后输入聊天内容  然后再一次按下Enter发送消息,我们默认第一次按下Enter后置全局变量为聊天状态,以后每按一次Enter键就会将g_bChatting置反。嗯,听起来貌似很和谐了,细心的朋友会发现一个细节,就是当按下Enter键后出现聊天框,然后我们按ESC,这样也会改变聊天状态,所以我们这样处理当按下ESC键后置g_bChatting为未聊天状态。细心的朋友还会发现一个问题,就是当初我们默认的情况(第一次按下Enter后置全局变量为聊天状态)其实这是不对的,如果在进入游戏之前(包括装载过程和局域网等待玩家加入游戏的过程)按的Enter键次数不是偶数次,就会出现问题,所以我们每次进入游戏后先按ESC进行一个置位的操作。
4.其他
为了更加人性化,使我们的改键工具尽量不影响到其他应用程序,我们可以检测WarIII的状态,通过窗口遍历查找到WarIII的窗体句柄(如果没找到我们就认为WarIII没有运行,此时就不要改键了),然后判断窗体的状态,如果窗体不是出于全屏的状态(用户切出来了)我们也不要改键,然后把这段检测WarIII的代码放到一个定时器中,这样就很人性化的完成了一个改键工具。
先打个广告:有时间我会写个 ‘真3中法完美EN工具’ 送给玩真3的朋友,嘿嘿,作弊了昂,咱尽量不要用。。。
[更新说明]
1.经过朋友的简单测试,发现一个BUG,就是在进入游戏之前的局域网主机内等人的过程中聊天状态识别完全失效。现修改为,设置一个标志位,按Scroll Lock键进行 开启/关闭 改键功能,当处于局域网主机内等人的过程中聊天时,要按一下Scroll Lock取消改键,然后装载完毕后,再按一次复位。2009年11月14日2:45:22 附件已更新

【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!


                                                       2009年11月13日 00:10:10

2021 KCTF 秋季赛 防守篇-征题倒计时(11月14日截止)!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (59)
雪    币: 1834
活跃值: 活跃值 (15)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
yingyue 活跃值 2009-11-13 09:29
2
0
收下看看。。。。。。。。。。。。。。。。。。。
雪    币: 33
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
aichenlong 活跃值 2009-11-13 11:49
3
0
学习学习。。
雪    币: 47
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wanghg 活跃值 2009-11-13 14:53
4
0
好东西 下来看看
雪    币: 173
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yzsx 活跃值 2009-11-13 15:15
5
0
暂时不下载源码啦,看不懂,还是先好好看asm吧
雪    币: 2081
活跃值: 活跃值 (109)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝