Подавить клавиши переключения задач (winkey, alt-tab, alt-esc, ctrl-esc) с помощью низкоуровневого перехватчика клавиатуры

Я пытаюсь подавить клавиши переключения задач (например, winkey, alt + tab, 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. Какие-либо предложения? Спасибо.


person Matthew King    schedule 22.03.2010    source источник


Ответы (2)


Это должно помочь:

bool ControlDown = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
if (lParam.Key == VK_ESCAPE && ControlDown)
    suppress = true;
person RaptorFactor    schedule 09.04.2010

Это то, что мне нужно для работы, я также добавил 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);
    }
person Smurf-IV    schedule 08.01.2019