首页 文章

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

提问于
浏览
2

我试图通过使用低级键盘钩来抑制任务切换键(如winkey,alt选项卡,alt 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 回答

  • 0

    这应该做的伎俩:

    bool ControlDown = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
    if (lParam.Key == VK_ESCAPE && ControlDown)
        suppress = true;
    
  • 1

    这就是我的工作,我还添加了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);
        }
    

相关问题