我写了一个钩子函数,对于非特殊的按键方式,可成功拦截Win键;但是特殊按键就会出现问题。如:当拦截程序运转后,单击Win键会失效,即Windows开始菜单不会弹出。这时,快速连击(两次以上即可)则会发现Windows出现粘滞键状况(不明白粘滞键的请查询windows帮助),这时需要单击Win键才能消除该状态,但是单击Win键会被拦截,因此状态则无法消除了,出现状况:按任意键都相对于 所按键+win键 的效果。根据windows帮助设置“按两次键修改”的设置,问题依然。请大侠看看怎么处理比较好?
拦截函数如下:HHOOK  glhHook;LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
BOOL fEatKeystroke = FALSE;
PKBDLLHOOKSTRUCT p = NULL;
APP_CONF AppConf = ((CUnwinApp*)AfxGetApp())->m_AppConf;
if (nCode == HC_ACTION) 
{
p = (PKBDLLHOOKSTRUCT) lParam;
switch (wParam) 
{
case WM_KEYDOWN: 
//    // Backdoor to user information
//    if (p->vkCode == VK_F8)
//    {
//     ::MessageBox(NULL,"Let's make things better and better!\n","HQ Tech",MB_OK);
//     break;
//    }
case WM_SYSKEYDOWN:
case WM_KEYUP:    
case WM_SYSKEYUP: 
fEatKeystroke = (p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN) ||  // 屏蔽Win
// 屏蔽Alt+Tab
((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
// 屏蔽Alt+Esc
((p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
// 屏蔽Ctrl+Esc
((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0))) ;
break;
default:
break;
}
} return (fEatKeystroke ? TRUE : CallNextHookEx(glhHook,nCode,wParam,lParam));
}

解决方案 »

  1.   

    在处理完Win键后,程序就return试试,不要CallNextHookEx。
      

  2.   

    This value is returned by the next hook procedure in the chain. The current hook procedure must also return this value. The meaning of the return value depends on the hook type. For more information, see the descriptions of the individual hook procedures
      

  3.   

    CallNextHookEx是为了保证继续传递消息,否则,可能出现系统问题
      

  4.   

    如果是只拦截组合键,应该结合GetAsyncKeyState,对于过滤了的键,应该直接返回-1.