hur.cn - 华软网

 热门搜索

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

  作者:未知    来源:网络    更新时间:2011/9/8
我的代码本意是发送 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
---华软 网友回答---
有四个的组合键吗?
---华软网友回复---
不能4个键吗?
但是我们程序实际上使用的是ctrl + shift + alt + win + end
直接按键盘能响应的
---华软网友回复---
不是吧,组合键可以这样发?你先用两个试试!
---华软网友回复---
问题应该是出在shift上面的
如果我发ctrl + alt + win + end
完全没有问题
但是发ctrl + shift + alt + end就不行,就会多出一个shift的up和down
---华软网友回复---
看你的组合键发的
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);
     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。