keybd_event发送组合键消息会产生多余按键消息,是函数的bug?

我的代码本意是发送 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

作者: yichigo   发布时间: 2011-09-08

有四个的组合键吗?

作者: ouyh12345   发布时间: 2011-09-08

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

作者: yichigo   发布时间: 2011-09-08

不是吧,组合键可以这样发?你先用两个试试!

作者: fandh   发布时间: 2011-09-08

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

作者: yichigo   发布时间: 2011-09-08