Frage

Ich bin C#-Neuling und arbeite gerade an einer vorhandenen Anwendung.Ich habe ein DirectX-Ansichtsfenster mit Komponenten, die ich mithilfe der Pfeiltasten positionieren möchte.

Derzeit überschreibe ich ProcessCmdKey, fange Pfeileingaben ab und sende ein OnKeyPress-Ereignis.Das funktioniert, aber ich möchte Modifikatoren verwenden können(ALT+STRG+SCHICHT).Sobald ich einen Modifikator halte und einen Pfeil drücke, werden keine Ereignisse ausgelöst, die ich gerade höre.

Hat jemand irgendwelche Ideen oder Vorschläge, wohin ich damit gehen soll?

War es hilfreich?

Lösung

Wie bestimmen Sie in Ihrem überschriebenen ProcessCmdKey, welche Taste gedrückt wurde?

Der Wert von keyData (dem zweiten Parameter) ändert sich abhängig von der gedrückten Taste und etwaigen Zusatztasten. Wenn Sie also beispielsweise den linken Pfeil drücken, wird der Code 37 zurückgegeben, bei gedrückter Umschalt-Links-Taste wird 65573, bei Strg-Links-Taste 131109 und bei Alt-Links-Code 262181.

Sie können die Modifikatoren und die gedrückte Taste durch UND-Verknüpfung mit entsprechenden Aufzählungswerten extrahieren:

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
}

Andere Tipps

Ich habe positiv gestimmt Tokabis Antwort, aber zum Vergleichen von Schlüsseln gibt es einige zusätzliche Ratschläge StackOverflow.com hier.Hier sind einige Funktionen, die ich verwendet habe, um alles zu vereinfachen.

   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);
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top