Pregunta

Me quedé atrapado.

En este momento, estoy usando el siguiente código para escuchar teclas de acceso rápido:

    [DllImport("user32.dll")]
    public static extern bool RegisterHotKey(IntPtr hWnd,
      int id, int fsModifiers, int vlc);
    [DllImport("user32.dll")]
    public static extern bool UnregisterHotKey(IntPtr hWnd, int id);


    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0312)
        {
            // whatever i need
        }
        base.WndProc(ref m);
    }

y esta función para registrar tecla de acceso directo:

Form1.RegisterHotKey(this.Handle, this.GetType().GetHashCode(), 0, (int)chr);

funciona perfectamente. mi pregunta es ¿Cómo registro múltiples teclas de acceso rápido como la misma combinación, por ejemplo:

  1. A + B + C + D
  2. Alt + Shift + B
  3. CTRL + ALT + SHIFT + X

editar: descubrí (como dijo Zooba) cómo "descifrar", que fue enviado tecla de acceso directo y aquí está la solución:

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0312)
        {
            Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF);
            ModifierKeys modifier = (ModifierKeys)((int)m.LParam & 0xFFFF);
            if ((modifier + "+" + key == "Alt+S"))
            {
                //do what ever I need.
            }
        }
        base.WndProc(ref m);
    }
¿Fue útil?

Solución 2

He encontrado la respuesta. En lugar de utilizar registerhotkey, solía KeyState y resuelto todos mis problemas. Si alguien está interesado, puede ve aquí ( copia de seguridad en archive.org )

Otros consejos

A partir de la documentación de WM_HOTKEY :

IParam Las especifica palabra de orden inferior de las teclas que iban a ser presionan en combinación con la clave especificada por la palabra de orden para generar el mensaje WM_HOTKEY. Esta palabra puede ser uno o más de los siguientes valores. La palabra de orden superior especifica el código de tecla virtual de la tecla de acceso rápido.

Así se puede leer el miembro de LParam m para determinar las teclas que se presionan (alternativamente, si asigna identificadores más sensible que GetHashCode puede comprobar WParam).

La 'palabra de orden superior' y 'palabra de orden inferior' se refieren a partes del número entero (en realidad un IntPtr) contenido en LParam, por lo que tendrá que extraer estos. La palabra de bajo orden es i & 0xFFFF, mientras que la palabra de orden es (i >> 16) & 0xFFFF.

Para detectar que la combinación de teclas se presionó, compruebe los cuatro bits más bajos de la palabra de orden inferior para los modificadores (cambio, alt, de control) y comparar la palabra de orden superior contra el código de tecla virtual - que para las cartas es igual que el valor del carácter de la capital (por ejemplo, el código de tecla virtual de a es (int) 'a', pero no (int) 'a').

Su combinación de 'A + B + C + D' no es válida, ya que las teclas rápidas WM_HOTKEY sólo admiten un único carácter. Usted tendrá que adjuntar un enlace de teclado para detectar que la combinación de cualquier parte (o mensajes de manejar si sólo se desea detectar que mientras la aplicación está activa).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top