我使用了2种方法:
1:使用PostMessage()   HWND Handle;
   Handle = FindWindow(NULL, "game");//找到目标窗口的Handle
   if ( Handle == NULL )  return;
   PostMessage(Handle,WM_KEYDOWN, VF_F5, 0L);  //按下
   Sleep(5);
   PostMessage(Handle,WM_KEYUP, VF_F5, 0L);   //释放2:捆绑线程
     HWND Handle;
     DWORD dwthreadforeground, dwthreadthis;
     //获得活动窗口的线程号
     dwthreadforeground = ::GetWindowThreadProcessId(Handle, NULL);
     //获得与自己程序的窗口相关的线程号
     dwthreadthis = ::GetWindowThreadProcessId(this->Handle, NULL);
     //将两个线程的输入联系起来
     ::AttachThreadInput(dwthreadthis, dwthreadforeground, TRUE);
     keybd_event(VK_F5,0,0,0);     //按下
     Sleep(5);
     keybd_event(VK_F5,0,0,0);     //释放
     //将联到一起的两个线程的输入分离
     ::AttachThreadInput(dwthreadthis, dwthreadforeground, FALSE);以上2种方法在记事本等等窗口中试验是有效的。
但我这段程序的目的是让某个游戏窗口不停的按键
昨天试了一下,程序对游戏窗口无效。估计是屏蔽了其他进程的消息?
我对windows的消息机制不了解,PostMessage()是不是把WM_KEYDOWN这个
消息放到Handle这个进程的消息队列中,进而让Handle进程处理这个消息。
但是现在看来对游戏窗口是无效的。怎么解决?
多谢!!!!!!!!!!!

解决方案 »

  1.   

    第2种方法里面漏了
       Handle = FindWindow(NULL, "game");//找到目标窗口的Handle
       if ( Handle == NULL )  return;
      

  2.   

    PostMessage()是异步的,SendMessage()试试
      

  3.   

    问题很奇怪
    HWND Handle;
    Handle = FindWindow(NULL, "1.txt - 记事本");//找到目标窗口的Handle
    if ( Handle == NULL )  return;
    SendMessage(Handle,WM_KEYDOWN, VF_F5, 0L);  //按下
    Sleep(5);
    SendMessage(Handle,WM_KEYUP, VF_F5, 0L);   //释放是无效的,而用PostMessage()是有效的
      

  4.   

    建议你用spy看看,消息有没发送过去