我用
keybd_event(VK_DOWN,MapVirtualKey(VK_DOWN, 0), KEYEVENTF_EXTENDEDKEY,0); 
keybd_event(VK_DOWN,MapVirtualKey(VK_DOWN, 0), KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP,0); 
给游戏发送按键消息,游戏没有任何反应
我用spy++看了游戏的按键消息,键盘按键和虚拟按键的消息是一模一样的
<00001> 000A0264 P WM_KEYDOWN nVirtKey:VK_UP cRepeat:1 ScanCode:48 fExtended:1 fAltDown:0 fRepeat:0 fUp:0
<00002> 000A0264 P WM_KEYUP nVirtKey:VK_UP cRepeat:1 ScanCode:48 fExtended:1 fAltDown:0 fRepeat:1 fUp:1
可为什么程序没响应啊

解决方案 »

  1.   

    1.游戏用GetKeyState等API获取键盘是否真的按下去了
    2.游戏采用DirectInput,模拟按键消息是不管用的
    搜下“winio”试试看。
      

  2.   

    winio是一个很好的方法,debugman上有源码参考
      

  3.   

    游戏采用DirectInput,模拟按键消息是不管用的
    正确。
      

  4.   

    用PostMessage()或SendMessage(),基本上90%的游戏都没问题,除非一些特别变态的,用GameGuard或其它保护的游戏。
      

  5.   

    #1说的就是我想说的游戏用GetKeyState等API获取键盘是否真的按下去了 这个很多时候可以通过注入进入Hook这个函数实现绕过,不过现在游戏都是驱动保护,所以比较难
      

  6.   


    1.游戏用GetKeyState等API获取键盘是否真的按下去了
    我倒是没发现有什么游戏会用GetKeyState()去检查键是否按下,那是因为这个API只能检查某个键是否按下,也就是检查KEY_DOWN状态,但却无法检查到KEY_UP.那么游戏中控制键是一直按着,然后角色会向某个方向一直走,GetKeyState()如何能判断到键是一直按着呢,还是键只是按下,然后就弹起了?2.游戏采用DirectInput,模拟按键消息是不管用的
    我能告诉你,模拟按键消息是绝对管用。我手上还有N年前写的模拟消息的程序可被检测,随便测试魔兽世界还是永恒之塔等现在流行的游戏是否管用(永恒之塔如果带有GameGuard保护,就先将GameGuard杀掉)
      

  7.   

    一般模拟按键用的方法无非就是几个:
    1.SendInput(),keybd_event()
    这种方法除非是注入游戏进程再用,否则只能是游戏窗口在最前台才可以用,因为这两个API的参数中没有窗口句柄,默认就是向最前台的窗口发送按键。2.驱动模拟按键(winio)
    和上面一样,还是只适用于最前台的窗口,除非是注入游戏进程再用。3.使用DirectInput Hooking
    基本上就是加载DLL进入目标进程,对Direct Input消息进行拦载,向目标进程发送模型按键。
    对Direct Input的游戏都有效4.PostMessage()或SendMessage()
    理论上任何使用Direct Input和没调用过任何驱动保护的游戏都适用,而且并不需要游戏处于前台,并不需要注入到游戏进程,只要获得游戏窗口句柄即可用,就算是游戏窗口最小化,游戏一样可以捕获到PostMessage()发送的按键。魔兽世界,没GameGuard保护的永恒之塔,大话西游,征途,武林外传,诛仙,天龙八部等游戏测试过,上面四种方法基本都可以使用,不过前三种如果兼容性要高的话,基本都要注入到游戏进程中去,唯有第四种只需要获取游戏的窗口句柄即可。