我想做一个劲乐团的外挂程序,所有需要程序模拟键盘输入第一次我使用了keybd_event('A',0,0,0);进游戏,发现毫无反映,倒是聊天的时候会自动跳A,但打的时候没反映第二次使用INPUT input[2];
memset(input,0,sizeof(INPUT));input[0].type = INPUT_KEYBOARD;
input[1].type = INPUT_KEYBOARD;input[0].ki.wVk = 'A';input[1].ki.wVk = 'A';
input[1].ki.dwFlags = KEYEVENTF_KEYUP;::SendInput(2, &input[0], sizeof(INPUT));
结果和上次一样!!!第3次使用:获得鼠标所在位置的窗口HANDEL 然后发送消息CPoint pt;
GetCursorPos(&pt);
HWND hWnd;
hWnd=::WindowFromPoint(pt);::SendMessage(hWnd,WM_CHAR ,'A',0);
结果还是不行
现在我认为是窗口句丙问题,用FindWindow(NULL,"????") 因为不知道他窗口标题所以没法查
而且可能还有子窗口,请教这该怎么办?

解决方案 »

  1.   

    只用keybd_event就能解决问题了,sendInput效果一样。
    只是keybd_event('A',0,0,0);这样的用法不对。后面几个参数不能随便置0的。
    因为只有最普通的编辑控件才仅用到字符编码,多数游戏都忽略字符编码,使用扫描码或其它东东来识别按键。所以你要多看看MSDN,把它的参数搞明白了,一定要填正确,不能省略或乱填。SendMessage 是很麻烦的,通常这样做都不能成功,因为windows从内核到应用是很复杂的。你不了解目标程序的底层实现,乱用SendMeesage多半会导致失败。
      

  2.   

    还有阿,你的 SendMessage 的第四个参数你把它置0了,这也是导致错误的原因。
    sendInput 的INPUT结构差了很多参数都没填,给他们用0值是不会成功的。
      

  3.   

    keybd_event是需要激活目的窗口,SetForegroundWindow
    先用Spy++看究竟哪个子窗口,才是接受输入的,然后用FindWindowEx或遍历子窗口得到
      

  4.   

    EnumChildWindow枚举所有的子窗口,先找到子窗口
      

  5.   

    谁能帮我复制一下keybd_event的MSDN信息啊,我这里暂时没MSDN....
      

  6.   

    我现在用
    keybd_event('A',MapVirtualKey('A',0),0,0);
    keybd_event('A',MapVirtualKey('A',0),KEYEVENTF_KEYUP,0);函数MapVirtualKey把键值转成扫描码
    UINT MapVirtualKey(UINT uCode, // virtual-key code or scan code
    UINT uMapType // translation to perform
    );还是老样子,我试在其他游戏,比如魔兽里 都能启动快界键就是劲乐团不行
      

  7.   

    因为你的键盘和鼠标已经直接被DX接管了。对这样的游戏应该使用DirectInput。