我写了个小程序,向另外一个程序发送WM_KEYDOWN,WM_KEYUP消息,即模拟键盘事件.
目的是省得老要手动按.但是没有作用,我用spy抓了真实的键盘消息和我模拟的键盘消息,比较了也是一样的,
但是为什么不起作用?什么样的原因会导致这种情况?不一定要给解决办法,给个方向提示就好,我现在就是压根不知道问题出在哪里了.

解决方案 »

  1.   

    为什么一定要用hook?
    我按键盘的效果和我发键盘消息的效果为什么不一样?
      

  2.   

    你是不是用keybd_event,执行keybd_event时,另一进程(你要接收key的程序)应该是活动进程(且有活动窗口),才会有效。
      

  3.   

    我把目标窗口设成活动窗口了.
    postmessage我也试了,也不行.zhucde兄麻烦再说的详细点.
    消息不都是窗口收到了么?应该不用我再特地将这个消息发送给哪个控件吧.
    窗口应该没有找错,因为我用spy看目标窗口的信息,按键盘的和我的程序发的,一样的消息但就是模拟的不起作用.
      

  4.   

    你是用keybd_event还是PostMessage或SengMessage?
    如果是仅对编辑框充填用
    SendMessage(hwnd,WM_SETTEXT,0,(LPARAM)buf);
    更简单,如果非要发送WM_KEYDOWN WM_KEYUP,则必须是PostMessage而不是SendMessage,因为
    SendMessage未经队列翻译,向编辑框发送WM_KEYDOWN和WM_KEYUP是没有用的(不会得到WM_CHAR消息)。
      

  5.   

    你是用keybd_event还是PostMessage或SengMessage?
    ------------------------------------------------
    都试了.其实是个游戏界面(想象下一个很烂的小人走来走去的游戏的形势),用spy居然找不到子窗口,应该都是自己画出来的窗口.所以即使我想对那个控件发什么消息,寻找子窗口似乎是行不通的吧.
    郑重声明,俺是为了学习目的,没有其他不良想法哦.
      

  6.   

    1:确定你的句柄是否正确!
    2:你发送消息的语句是否正确!
    ----------------------------
    SendMessage(hWnd,WM_KEYDOWN,VK_LEFT,0L); // VK_LEFT为你要模拟的按键
    SendMessage(hWnd,WM_KEYUP,VK_LEFT,0L);
      

  7.   

    你的程序可能是基于对话框的,别忘了对话框不响应键盘消息。
    如果要对话框窗体响应键盘消息,你应该重载PreTranslateMessage函数。如下:
    BOOL CDsafDlg::PreTranslateMessage(MSG* pMsg) 
    {
       // TODO: Add your specialized code here and/or call the base class
      if(pMsg->message==WM_CHAR)
       {
        .......
       return TRUE; //返回true说明消息已处理
        }
      else
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  8.   

    就是说可能你的程序已收到了你发送的消息但并不处理,你重载一下PreTranslateMessage试试看,在这里拦截消息。
    基于对话框程序属于模态对话框,它有自已的消息派送机制。
      

  9.   

    postmessage 我的成功的,不过参数要正确才行
      

  10.   

    在目标窗口能收到你发的消息吗?
    如果能,则是目标窗口处理的问题.
    否则是你发送消息出了问题!
    -----------------------------------------用spy抓目标窗口可以看到我模拟的消息,但我就是想不通为什么不起作用.
    目标窗口不是我的程序.
      

  11.   

    游戏程序一般用DirectX开发的吧。用SendInput或者截取DirectInput看看。
      

  12.   

    把程序发过来,我可以帮你看一下
    ----------------------------------
    真没什么好发的,就是findwindow,然后postmessage而已.
    游戏程序一般用DirectX开发的吧。用SendInput或者截取DirectInput看看。
    ------------------------------------------------------------------
    等下我就试一试.