Pregunta Cómo enlazar Win + Tab usando LowLevelKeyboardHook


En pocas palabras: bloqueo Ganar después de Ganar + Lengüeta hace que Windows piense Ganar todavía está abajo, entonces presionando S con el Ganar Por ejemplo, la tecla abrirá el hechizo de búsqueda en lugar de simplemente escribir "s" ... hasta que el usuario presione Ganar de nuevo. No bloquearlo significa que se mostrará el menú Inicio de Windows. Estoy en un acertijo!


No tengo problemas para conectar atajos usando Alt + Lengüeta utilizando LowLevelKeyboardHook, o Ganar + Alguna clave Ubounded utilizando RegisterHotKey. El problema ocurre solo con el Ganar clave usando LowLevelKeyboardHook.

En el siguiente ejemplo, estoy tomando el control Ganar evento cuando el Ganar + Lengüeta combinación es detectada Esto hace que cada pulsación de tecla siguiente se comporte como si Ganar la clave todavía estaba abajo.

        private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode != HC_ACTION)
                return CallNextHookEx(_hookID, nCode, wParam, lParam);

            var keyInfo = (Kbdllhookstruct)Marshal.PtrToStructure(lParam, typeof(Kbdllhookstruct));

            if (keyInfo.VkCode == VK_LWIN)
            {
                if (wParam == (IntPtr)WM_KEYDOWN) {
                    _isWinDown = true;
                } else {
                    _isWinDown = false;

                    if (_isWinTabDetected) {
                        _isWinTabDetected = false;
                        return (IntPtr)1;
                    }
                }
            }
            else if (keyInfo.VkCode == VK_TAB && _isWinDown) {
                _isWinTabDetected = true;

                if (wParam == (IntPtr)WM_KEYDOWN) {
                    return (IntPtr)1;
                } else {
                    _isWinTabDetected = true;
                    Console.WriteLine("WIN + TAB Pressed");
                    return (IntPtr)1;
                }
            }

            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }
    }
}

Puede encontrar el código completo aquí (tenga en cuenta que debe reemplazar su Program.cs en un proyecto de WinForms vacío para ejecutar): https://gist.github.com/christianrondeau/bdd03a3dc32a7a718d62 - prensa Ganar + Lengüeta y el Form el título debe actualizarse cada vez que se presiona el atajo.

Tenga en cuenta que intención de enganchar en esta combinación específica es proporcionar un Alt + Lengüeta alternativa sin reemplazar Alt + Lengüeta sí mismo. Una respuesta que proporciona la capacidad de iniciar código personalizado usando Ganar + Lengüeta también será aceptado.

Aquí están mis ideas, para las cuales no pude encontrar documentación. Todos responderían mi pregunta con éxito.

  • Dile a Windows que "cancele" el Ganar sin activarlo
  • Evite que Windows inicie el menú Inicio una vez
  • Enganche directamente en Windows Ganar + evento en lugar de enganchar manualmente en las teclas (esto sería con mucho mi primera opción si eso existe)

10
2017-11-28 02:35


origen


Respuestas:


Esto parece hacer exactamente lo que quiere (omita RWin si lo desea).

¡Tenga en cuenta y anule el registro de este enlace de KB cuando su aplicación pierda el foco!

    [DllImport("user32.dll")]
    static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey);

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode == HC_ACTION)
        {
            var keyInfo = (Kbdllhookstruct) Marshal.PtrToStructure(lParam, typeof (Kbdllhookstruct));
            if ((int) wParam == WM_KEYDOWN
                && keyInfo.VkCode == VK_TAB
                && (GetAsyncKeyState(Keys.LWin) < 0 || GetAsyncKeyState(Keys.RWin) < 0))
            {
                _mainForm.Text = "Win + Tab was pressed " + (++_winTabPressCounter) + " times";
                return (IntPtr) 1;
            }
        }

        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

Intenté varias cosas antes de descubrir esta técnica. Esta publicación fue la más útil https://stackoverflow.com/a/317550/55721


2
2017-07-24 22:30



El sistema necesita saber que liberas la tecla de Windows. Compruebo la diferencia entre mi propio gancho que no tiene este problema y la única diferencia entre usted y la mía es esta línea:

if (_isWinTabDetected) {
    _isWinTabDetected = false;
     return (IntPtr)1; //THIS LINE 
}

4
2017-07-03 13:27