代码之家  ›  专栏  ›  技术社区  ›  Matthew King

使用低级键盘挂钩抑制任务切换键(winkey、alt tab、alt esc、ctrl esc)

  •  2
  • Matthew King  · 技术社区  · 14 年前

    我试图抑制任务切换键(例如 威基 , 中高音 + 标签 , 中高音 + ESC , CTRL + ESC 使用低级键盘挂钩。

    我用的是 LowLevelKeyboardProc 回调:

    IntPtr HookCallback(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam) 
    {
        if (nCode >= 0)
        {
                bool suppress = false;
    
                // Suppress left and right windows keys.
                if (lParam.Key == VK_LWIN || lParam.Key == VK_RWIN) 
                    suppress = true;
    
                // Suppress alt-tab.
                if (lParam.Key == VK_TAB && HasAltModifier(lParam.Flags)) 
                    suppress = true;
    
                // Suppress alt-escape.
                if (lParam.Key == VK_ESCAPE && HasAltModifier(lParam.Flags)) 
                    suppress = true;
    
                // Suppress ctrl-escape.
                /* How do I hook CTRL-ESCAPE ? */
    
                // Suppress keys by returning 1.
                if (suppress) 
                    return new IntPtr(1);
        }
        return CallNextHookEx(HookID, nCode, wParam, ref lParam);
    }
    
    bool HasAltModifier(int flags)
    {
        return (flags & 0x20) == 0x20;
    }
    

    但是,我不知道如何抑制 CTRL + ESC 组合。 有什么建议吗?谢谢。

    2 回复  |  直到 6 年前
        1
  •  1
  •   RaptorFactor    14 年前

    这应该可以做到:

    bool ControlDown = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
    if (lParam.Key == VK_ESCAPE && ControlDown)
        suppress = true;
    
        2
  •  0
  •   Smurf-IV    6 年前

    这就是我要做的,我还添加了alt+f4来防止应用程序关闭。

        private static bool lastWasCtrlKey = false;
    
        private static IntPtr captureKey(int nCode, IntPtr wp, IntPtr lp)
        {
            if (nCode >= 0)
            {
                KBDLLHOOKSTRUCT objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lp, typeof(KBDLLHOOKSTRUCT));
    
                // Disabling Windows keys 
                switch (objKeyInfo.key)
                {
                    case Keys.RWin:
                    case Keys.LWin:
                    case Keys.Tab when HasAltModifier(objKeyInfo.flags):
                    case Keys.Escape when HasAltModifier(objKeyInfo.flags):
                    case Keys.Delete when HasAltModifier(objKeyInfo.flags):
                    case Keys.F4 when HasAltModifier(objKeyInfo.flags):
                    case Keys.Escape when lastWasCtrlKey:
                        lastWasCtrlKey = false;
                        return (IntPtr)1; 
                    case Keys.LControlKey:
                    case Keys.RControlKey:
                        lastWasCtrlKey = true;
                        break;
                    case Keys.LShiftKey:
                    case Keys.RShiftKey:
                        // Do nothing as the Ctrl key could have been before this
                        break;
                    default:
                        lastWasCtrlKey = false;
                        break;
                }
            }
            return CallNextHookEx(ptrHook, nCode, wp, lp);
        }
    
    推荐文章