我的键盘钩子可以正常运行,但是有个最重要的一点,
当按下hotkey时,假使在某个应用程序上,应用程序
如果有一样的热键,那么会执行完应用程序的热键,然后
在执行我的热键,但是我需要遮蔽应用程序的,只想让我的运行
请问怎么办到?
下面是我的dll部分代码,请帮忙改一下(((((((((((((((((((((((
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
BOOL bProcessed=FALSE;
if(HC_ACTION==nCode)
{
if((lParam&0xc0000000)==0xc0000000){// Key up
switch(wParam)
{
case VK_MENU:
MaskBits&=~ALTBIT;
break;
case VK_CONTROL:
MaskBits&=~CTRLBIT;
break;
case VK_SHIFT:
MaskBits&=~SHIFTBIT;
break;
default: //judge the key and send message
break;
}
for(int index=0;index<MAX_KEY;index++){
if(hCallWnd[index]==NULL)
continue;
if(IsWindow(hCallWnd[index])&&(HotKey[index]==wParam)&&(HotKeyMask[index]==MaskBits)){
SendMessage(hCallWnd[index],WM_HOTKEY,wParam,WM_KEYUP);
bProcessed=TRUE;
}
}
}
if((lParam&0xc000ffff)==1){ //Key down
switch(wParam)
{
case VK_MENU:
MaskBits|=ALTBIT;
break;
case VK_CONTROL:
MaskBits|=CTRLBIT;
break;
case VK_SHIFT:
MaskBits|=SHIFTBIT;
break;
default: //judge the key and send message
break;
}
for(int index=0;index<MAX_KEY;index++){
if(hCallWnd[index]==NULL)
continue;
if(IsWindow(hCallWnd[index])&&(HotKey[index]==wParam)&&(HotKeyMask[index]==MaskBits)){
SendMessage(hCallWnd[index],WM_HOTKEY,wParam,WM_KEYDOWN);
bProcessed=TRUE;
}
}
}
else
{ }
if(!bProcessed){
for(int index=0;index<MAX_KEY;index++){
if(hCallWnd[index]==NULL)
continue;
if(IsWindow(hCallWnd[index])&&(HotKey[index]==0)&&(HotKeyMask[index]==0))
SendMessage(hCallWnd[index],WM_HOTKEY,WM_HOTKEY,lParam);
}
}
}
return CallNextHookEx( hHook, nCode, wParam, lParam );
}

解决方案 »

  1.   

    当有符合你条件的HOTKEY时,不要调用CallNextHookEx,而是直接返回NULL
    if(HotKey)
    return NULL;
    return CallNextHookEx(...);
      

  2.   

    1 尝试用WH_DEBUG钩子,确保你的钩子回调在第一顺位执行2 假如允许,就不要调用CallNextHookEx,这样才能实现真正的过滤
      

  3.   

    CallNextHookEx就会调用下一个钩子,可能就没能过滤,
    如果不用,需要保证不会造成系统钩子无效
      

  4.   

    同意。不用CallNextHookEx.但可能造成莫名错误哦
      

  5.   

    我把我代码最下面的
    return CallNextHookEx( hHook, nCode, wParam, lParam );
    改成
    return NULL;还是一样会调用应用程序的热键