我需要向一个程序发送ctrl+v的按键消息。用PostMessage或者SendMessage都发现ctrl失效,不知问题出在哪里。现在说明如下:
我以windows的计算器(calc)为例子,选择科学型的16进制。
我的程序:
          ::PostMessage(AppWnd,WM_KEYDOWN,'C',MapVirtualKey('C',0));
 ::PostMessage(AppWnd,WM_KEYUP,'C',MapVirtualKey('C',0));
这两句可以正常运行,输入窗口出现C但是如果组合上ctrl就不行。
         ::PostMessage(AppWnd,WM_KEYDOWN,VK_CONTROL,MapVirtualKey(VK_CONTROL,0));
::PostMessage(AppWnd,WM_KEYDOWN,'C',MapVirtualKey('C',0));
::PostMessage(AppWnd,WM_KEYUP,'C',MapVirtualKey('C',0));
::PostMessage(AppWnd,WM_KEYUP,VK_CONTROL,MapVirtualKey(VK_CONTROL,0));
这四句运行不正常,ctrl不起作用。也就是说,CTRL C并没有启到copy的作用,或者说,这四句话没有实现向计算器发送ctrl + c的按键消息我不知道问题出在哪里,所有的按键,比如数字、字母,甚至F1-F12都可以成功发送唯独组合了ctrl或者shift还有alt就不行。特别提醒:
1. 我知道keybd_event是可以的,我也用keybd_event实现了ctrl + c 的组合功能。在这里,我希望得到不用keybd_event的解决方法。
2. ctrl+c只是一个组合键的例子,所以类似向程序发送剪贴板消息命令的方法就不用了,我需要的是组合按键消息希望高手们提出自己的思路,万分感谢!!

解决方案 »

  1.   

    用SendInput。WM_KEYDOWN是通知消息:The WM_KEYDOWN message is posted to the window with the keyboard focus when a nonsystem key is pressed. 也就是说,在按键以后,窗口才会收到这个消息。换句话说,这个消息是按键操作(或者用SendInput/keybd_event模拟)的结果,而不是用来触发按键操作的。所以用PostMessage或者SendMessage来模拟键盘消息并不是一个很好的选择
      

  2.   

    谢谢回复~~
    SendInput/keybd_event必须要保证程序不是在后台运行,所以我不能用。
    用PostMessage或者SendMessage来模拟键盘消息,我已经可以实现单个按键(数字、字母,甚至F1-F12),但是唯独对ctrl等特殊的按键,不知道如何去做  :)
      

  3.   

    你试试,用以下步骤来发送消息
    Ctrl WM_KEYDOWN
    C WM_KEYDOWN
    C WM_KEYUP
    Ctrl WM_KEYUP
    类似于软键盘操作的时候,发送KEYDOWN使Ctrl变黑
      

  4.   

    我试过很多次,PostMessage无法发送任何组合键,它只能发送一个按键“按过”的消息,不能让某个键一直处于“按下”状态。
      

  5.   

    SendInput/keybd_event必须要保证程序不是在后台运行,所以我不能用。-------------你是要做系统热键么?
      

  6.   

    Value Description 
    0–15 Specifies the repeat count for the current message. The value is the number of times the keystroke is auto-repeated as a result of the user holding down the key. The repeat count is always one for a WM_KEYUP message. 
      

  7.   

    keybd_event 发Ctrl,::PostMessage模拟按下"C"