我的代码本意是发送 ctrl + shift + alt + end 样的组合键,如下:void CDlgTestDlg::OnBnClickedButton2()
{
keybd_event(VK_LCONTROL, 0, 0, 0);
keybd_event(VK_LMENU, 0, 0, 0);
keybd_event(VK_LSHIFT, 0, 0, 0);
keybd_event(VK_END, 0, 0, 0); keybd_event(VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_END, 0, KEYEVENTF_KEYUP, 0);
}用spy++抓到的键盘消息里头多出了第4和第6两条,导致我的组合键失败,这是keybd_event的bug还是windows的特性呢?spy++抓到的键盘消息:
<00001> 004302BE P WM_KEYDOWN nVirtKey:VK_CONTROL cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00002> 004302BE P WM_KEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode:00 fExtended:0 fAltDown:1 fRepeat:0 fUp:0
<00003> 004302BE P WM_KEYDOWN nVirtKey:VK_SHIFT cRepeat:1 ScanCode:00 fExtended:0 fAltDown:1 fRepeat:0 fUp:0
<00004> 004302BE P WM_KEYUP nVirtKey:VK_SHIFT cRepeat:1 ScanCode:2A fExtended:0 fAltDown:1 fRepeat:1 fUp:1
<00005> 004302BE P WM_KEYDOWN nVirtKey:VK_END cRepeat:1 ScanCode:00 fExtended:0 fAltDown:1 fRepeat:0 fUp:0
<00006> 004302BE P WM_KEYDOWN nVirtKey:VK_SHIFT cRepeat:1 ScanCode:2A fExtended:0 fAltDown:1 fRepeat:0 fUp:0
<00007> 004302BE P WM_KEYUP nVirtKey:VK_MENU cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
<00008> 004302BE P WM_KEYUP nVirtKey:VK_SHIFT cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
<00009> 004302BE P WM_KEYUP nVirtKey:VK_CONTROL cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
<00010> 004302BE P WM_KEYUP nVirtKey:VK_END cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:1 fUp:1

解决方案 »

  1.   

    不能4个键吗?
    但是我们程序实际上使用的是ctrl + shift + alt + win + end
    直接按键盘能响应的
      

  2.   

    问题应该是出在shift上面的
    如果我发ctrl + alt + win + end
    完全没有问题
    但是发ctrl + shift + alt + end就不行,就会多出一个shift的up和down
      

  3.   

    看你的组合键发的
    keybd_event(VK_CONTROL, 0, 0, 0);
    keybd_event(VK_MENU, 0, 0, 0);
    keybd_event(VK_SHIFT, 0, 0, 0);
    keybd_event(VK_END, 0, 0, 0);
    keybd_event(VK_END, 0, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);