Estoy tratando de detectar teclas de acceso rápido de ALT + 1 a ALT + 9, pero cuando se presiona ALT, la tecla entra como Key.System. Cuando se presiona CTRL + NumPad0, la tecla es Key.NumPad0, que es correcta.

private void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
{
    bool isAlt = Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt);
    bool isCtrl = Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl);

    string ctrlMod = string.Empty;

    if (isAlt)
    {
        ctrlMod = "alt + " + e.Key.ToString();
    }

    if (isCtrl)
    {
        ctrlMod = "ctrl + " + e.Key.ToString();
    }

    Debug.WriteLine("Key is " + ctrlMod);
}

ALT + NumPad0 a través de ALT + NumPad9 produce:

La clave es alt + Sistema

Ctrl funciona correctamente

La clave es ctrl + NumPad1
La clave es Ctrl + NumPad2
La clave es ctrl + NumPad3

0
patrick 7 mar. 2017 a las 20:42

2 respuestas

La mejor respuesta

Puede usar las propiedades Keyboard.Modifiers y KeyEventArgs.SystemKey para detectar ALT+1 hasta ALT+9:

private void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (Keyboard.Modifiers == ModifierKeys.Alt)
    {
        string ctrlMod = "alt + " + e.SystemKey.ToString();
        Debug.WriteLine("Key is " + ctrlMod);
    }
}   

private void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
{
    bool isAlt = Keyboard.Modifiers == ModifierKeys.Alt;
    bool isCtrl = Keyboard.Modifiers == ModifierKeys.Control;

    string ctrlMod = string.Empty;

    if (isAlt)
    {
        ctrlMod = "alt + " + e.SystemKey.ToString();
    }

    if (isCtrl)
    {
        ctrlMod = "ctrl + " + e.Key.ToString();
    }

    Debug.WriteLine("Key is " + ctrlMod);
}
1
mm8 7 mar. 2017 a las 18:08

Creo que maccettura tiene razón y tiene que ver con los 'Códigos Alt de Windows'. Puedo evitarlo usando

if (Keyboard.IsKeyDown(Key.NumPad0)) { } 
0
patrick 7 mar. 2017 a las 17:54