2012-09-03 42 views
1

在我的钩子程序(键盘)当我点击右Alt时会发送按我两码和两个上发布:右ALT发送两个虚拟键码

代码:

LRESULT CALLBACK Recorder::keyboardHookProcedure(int code, WPARAM wParam, LPARAM lParam) { 
    if(code < 0) 
     return CallNextHookEx(m_mouseHook, code, wParam, lParam); 

    DWORD _vkCode = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam)->vkCode; 

    qDebug("vkCode: %d, wparam: %d, lparam: %d", _vkCode, wParam, lParam); 

    return CallNextHookEx(0, code, wParam, lParam); 
} 

上按

vkCode: 162, wparam: 260, lparam: 3398032 
vkCode: 165, wparam: 260, lparam: 3398032 

上释放

vkCode: 162, wparam: 257, lparam: 3398032 
vkCode: 165, wparam: 257, lparam: 3398032 

此外,请注意,当您按下该键时,它会将其发送为WM_SYSKEYDOWN(260),但是当您释放它时,wParam为WM_KEYUP(257)。什么......?它为什么这样工作?

回答

3

这是因为右ALT键(ALT-GR)是两个键的快捷方式 - ALT和CTRL

你得到WM_SYSKEYDOWN但WM_KEYUP,因为这是如何的消息被定义 - 如果你期待WM_SYSKEYUP,当你释放一个与ALT键一起按下的键 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms646287(v=vs.85).aspx

+0

这很容易...... xD,但是问题的第二部分呢?为什么按下这个键作为系统键并作为普通键释放? – tobi

+0

另一个问题,为什么然后ALT-GR + DEL不显示任务管理器? – tobi

+0

Alt-gr Del与ctrl-alt-del(更多)不同,因为它的处理级别低于普通组合键。它曾经习惯于IIRC – podiluska