Pregunta

Soy nuevo en C# y estoy trabajando en una aplicación existente.Tengo una ventana gráfica DirectX que tiene componentes que quiero poder posicionar usando las teclas de flecha.

Actualmente estoy anulando ProcessCmdKey, capturando la entrada de flecha y enviando un evento OnKeyPress.Esto funciona, pero quiero poder usar modificadores (ALTA+CONTROL+CAMBIO).Tan pronto como mantengo un modificador y presiono una flecha, no se activa ningún evento que esté escuchando.

¿Alguien tiene alguna idea o sugerencia sobre hacia dónde debería ir con esto?

¿Fue útil?

Solución

Dentro de su ProcessCmdKey anulada, ¿cómo determina qué tecla se ha presionado?

El valor de keyData (el segundo parámetro) cambiará dependiendo de la tecla presionada y de cualquier tecla modificadora, por lo que, por ejemplo, al presionar la flecha izquierda se devolverá el código 37, mayúsculas a la izquierda devolverá 65573, ctrl-izquierda 131109 y alt-izquierda 262181.

Puede extraer los modificadores y la tecla presionada haciendo AND con los valores de enumeración apropiados:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    bool shiftPressed = (keyData & Keys.Shift) != 0;
    Keys unmodifiedKey = (keyData & Keys.KeyCode);

    // rest of code goes here
}

Otros consejos

Yo voté a favor La respuesta de Tokabi., pero para comparar claves hay algunos consejos adicionales sobre StackOverflow.com aquí.Aquí hay algunas funciones que utilicé para ayudar a simplificar todo.

   public Keys UnmodifiedKey(Keys key)
    {
        return key & Keys.KeyCode;
    }

    public bool KeyPressed(Keys key, Keys test)
    {
        return UnmodifiedKey(key) == test;
    }

    public bool ModifierKeyPressed(Keys key, Keys test)
    {
        return (key & test) == test;
    }

    public bool ControlPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Control);
    }

    public bool AltPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Alt);
    }

    public bool ShiftPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Shift);
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (KeyPressed(keyData, Keys.Left) && AltPressed(keyData))
        {
            int n = code.Text.IndexOfPrev('<', code.SelectionStart);
            if (n < 0) return false;
            if (ShiftPressed(keyData))
            {
                code.ExpandSelectionLeftTo(n);
            }
            else
            {
                code.SelectionStart = n;
                code.SelectionLength = 0;
            }
            return true;
        }
        else if (KeyPressed(keyData, Keys.Right) && AltPressed(keyData))
        {
            if (ShiftPressed(keyData))
            {
                int n = code.Text.IndexOf('>', code.SelectionEnd() + 1);
                if (n < 0) return false;
                code.ExpandSelectionRightTo(n + 1);
            }
            else
            {
                int n = code.Text.IndexOf('<', code.SelectionStart + 1);
                if (n < 0) return false;
                code.SelectionStart = n;
                code.SelectionLength = 0;
            }
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top