2009-09-02 11 views
6

Ich habe versucht zu testen, ob die Alt-Taste gedrückt wurde.C# Keys Enumeration Confused: Keys.Alt oder Keys.RButton | Schlüssel.ShiftKey | Keys.Alt

Ich hatte einen Scheck ähnlich wie:

private void ProcessCmdKey(Keys keyData) 
{ 
if (keyData == Keys.Alt) 
{ 
    System.Console.WriteLine ("Alt Key Pressed"); 
} 
} 

Anyways unnötig zu sagen, wenn ich breakpointed, wenn ich die Alt gedrückt hatte Schlüssel der Debugger mir gesagt, der Schlüssel, der gedrückt wurde, war eigentlich Keys.RButton | Schlüssel.ShiftKey | Keys.Alt

Kann jemand etwas Licht auf das werfen, was vor sich geht, oder mich vielleicht auf einen Artikel hinweisen, der erklären kann?

Dank FZ

Edit: ich etwas bin immer noch, warum die ENUM verloren haben andere Bit hätte Werte gesetzt und kann nicht einfach die Alt-Taste? Ich verstehe, dass die Enum kann mehr als 1 Staat mit den Flaggen attrivbute enthalten, aber ich bin mir nicht sicher, warum es tut, wenn alles, was ich drückte, war Alt?

+2

Ich bin gespannt, warum diese Flags auch immer gesetzt sind. Scheint wie ein Fehler. – stone

Antwort

6

Wenn Sie testen möchten, ob AltTeil der gedrückten Tasten ist, können Sie einen bitweisen Test durchführen;

if((keyData & Keys.Alt) == Keys.Alt) {...} 
+1

Beat mich dazu ... – Donut

+1

Was ist besser aus einer Codierung Perspektive? == Schlüssel.Alt oder! = 0? –

+1

"== Keys.Alt" ist die beste Form. In jedem Fall, in dem der Wert (Keys.Alt in diesem Fall) kein einzelner Bitwert ist, gibt der! = 0-Test falsche positive Ergebnisse. Obwohl es in diesem Beispiel keinen Unterschied gibt, ist es besser, genau zu sein, so dass Sie niemals von einem Fall überrascht werden, in dem! = 0 fehlschlägt. –

4

Schlüssel ist ein Flags Enumeration. Dies bedeutet, dass es zu einem bestimmten Zeitpunkt mehr als einen Wert haben kann. Sie sollten es wie so überprüfen:

if ((keyData & Keys.Alt) == Keys.Alt) 
{ 
    // Alt was pressed! 
} 
+0

Beantwortet die OP-Frage nicht –

+0

@ ÁxelCostasPena Nicht sicher, dass ich zustimme - es erklärt, warum das Problem besteht, und zeigt, wie man es richtig überprüft. Was möchten Sie sonst noch? –

+0

Titel: "C# Keys Enumeration Confused: Keys.Alt oder Keys.RButton | Keys.ShiftKey | Keys.Alt". Body Lebenslauf: "Sowieso unnötig zu sagen, als ich gebrochen habe, als ich die Alt-Taste gedrückt hatte der Debugger sagte mir, der Schlüssel, der gedrückt wurde, war eigentlich Keys.RButton | Keys.ShiftKey | Keys.Alt. Kann jemand etwas Licht auf was geht auf oder vielleicht verweisen mich auf einen Artikel, der erklären kann? " Das Phänomen der Geister-Keypresses wurde nicht erläutert, lediglich ein Workaround wurde zur Verfügung gestellt. –

1

Enum mit Flags verwenden Bits umgesetzt.
Siehe diesen Link für einen guten Start - http://msdn.microsoft.com/en-us/library/cc138362.aspx

EDIT: Sind Sie mit der rechten (Maustaste) mit Shift-Taste während des Betriebs drücken, etwas zu wählen/highlight, während des Debuggens?

+0

Ich bin noch ein bisschen verloren, warum die ENUM andere Bitwerte gesetzt haben und nicht einfach die Alt-Taste? Ich verstehe, dass die Enum mehr als 1 Zustand enthalten kann, aber ich bin mir nicht sicher, warum es tut, wenn alles, was ich drückte, Alt war? – Setheron

+0

Nein. Ich hatte den Haltepunkt einfach am Anfang der Methode platziert und die ALT-Taste gedrückt. – Setheron

+0

Ich muss hinzufügen, dass ich ein GUI-Toolkit von Drittanbietern verwende, also könnte es eine Chance geben, dass sie den zu verarbeitenden Schlüssel hinzufügen, aber ich hoffe, dass sie es nicht sind. – Setheron

1

Mark-Technik (the accepted answer) funktioniert für Modifier-Tasten, aber es überraschte mich, dass einige Tasten (z. B. Pfeile) Kombinationen von Bits sind und nicht funktionieren. Zum Beispiel dreht sich der folgende Test wahr erwiesen:

((Keys.Right & Keys.Left) == Keys.Left) 

I posted some useful little functions for key handling über einen entsprechenden Beitrag in Bezug auf Stackoverflow Pfeiltaste Handhabung haben.