Laden...

Im KeyDown AltGr + weitere Taste abfangen

Erstellt von sonnenschwester vor 15 Jahren Letzter Beitrag vor 15 Jahren 5.388 Views
S
sonnenschwester Themenstarter:in
16 Beiträge seit 2008
vor 15 Jahren
Im KeyDown AltGr + weitere Taste abfangen

Hallo,

kann mir jemand sagen, wie ich bei einer TextBox im KeyDown Event auswerten kann, ob die Taste **AltGr + eine weitere Taste z.B. F1 gleichzeitig gedrückt **wurden.

if (e.KeyData == (Keys.LButton | Keys.ShiftKey | Keys.Control))

liefert mir die AltGr Taste, aber wie komme ich an die Zusatztaste ran, um dies auszuwerten.

Habs auch schon mit

if (e.KeyData == (Keys.LButton | Keys.ShiftKey | Keys.Control | Keys.F1)) 

versucht, aber das klappt leider auch nicht.

Bin für jede hilfe dankbar.

313 Beiträge seit 2006
vor 15 Jahren

beim Keydown gib mal das mit ner messagebox aus
e.KeyData.ToString()

und das vergleichst mit .equals mit dem string

Fertig!

S
sonnenschwester Themenstarter:in
16 Beiträge seit 2008
vor 15 Jahren

Danke für die schnelle Antwort.

Wenn ich AltGr + F1 drücke liefert die MessageBox "ControlKey, Control". F1 wird dabei überhaupt nicht ausgewertet. Für jede Taste wird ja auch ein eigener KeyDown Event aufgerufen.

MessageBox.Show(e.KeyData.ToString());

Es muss doch eine Möglichkeit geben, beides gleichzeitig auszuwerten. Irgendwas mach ich da noch falsch. Alt + F1 lässt sich ja auch problemlos überprüfen mit

e.KeyValue && e.Alt 
998 Beiträge seit 2007
vor 15 Jahren

Schau mal hier, evtl. hilft dir das ja.

Gruß David

S
sonnenschwester Themenstarter:in
16 Beiträge seit 2008
vor 15 Jahren

Nein, das bringt mich leider nicht weiter.

Ich brauche eine Kombination aus Funktionstaste (F1-F12) und AltGr.

Bin für jeden weiteren Tip dankbar.

4.939 Beiträge seit 2008
vor 15 Jahren

'AltGr' entspricht 'Ctrl+Alt', so daß du mal


if(e.Control && e.Alt && e.KeyCode == Keys.F1)
{

}

probieren solltest.

P.S: Anstatt MessageBox lieber eine Trace-Meldung ausgeben, da eine MessageBox ja alle weiteren Tasten blockiert...

S
sonnenschwester Themenstarter:in
16 Beiträge seit 2008
vor 15 Jahren

Hallo Th69,

vielen Dank. Funktioniert... Ich hatte was ähnliches probiert und es ging nicht, aber das ist es jetzt. MERCI....

5.299 Beiträge seit 2008
vor 15 Jahren

Hi!

Die Keys-Enumeration ist super-logisch aufgebaut, man muß nur wissen, wie:

Es gibt ein (short, int16) Low-Word und ein HighWord. Im LowWord ist der KeyCode. Im HighWord die Modifier.

Also die Taste [Alt][Ctr][Z] ist dargestellt mit

Keys.Alt | Keys.Control | Keys.Alt

Die Modifiers selbst stellen sich dar, indem man mit &xFFFF0000 maskiert (sei Key ein vollständiger TastenCode, also incl Modifiers)

int Modifiers = Key & 0xFFFF0000;

Für die Maskierung existieren sogar Konstanten in der Keys-Enumeration

(Keys.Modifiers = 0xffff0000)
int Modifiers = Key & Keys.Modifiers;

(Keys.KeyCode = 0xffff)
int keyCode = Key & Keys.KeyCode;

Bitshift der Modifier-Codes ist auch interessant:
(Keys.Shift >> 16 == 1)
(Keys.Control >> 16 == 2)
(Keys.Alt >> 16 == 4)

Aber geht natürlich auch wie Th69 arbeitet, denn die KeyEventArgs haben das enthaltene .KeyData schon finxnfertig aufgearbeitet in die 4 Member
bool .Shift
bool .Control
bool .Alt
int KeyCode

Der frühe Apfel fängt den Wurm.

S
sonnenschwester Themenstarter:in
16 Beiträge seit 2008
vor 15 Jahren

Hallo ErfinderDesRades,

mit dem >> Operator hab ich noch gar nicht gearbeitet.

Ich hab hier eine Datenbank, in der Tastaturkombinationen sind, die noch aus VB eingelesen wurden. Der Bitshift Code entspricht genau dem shift Wert aus VB im KeyDown. Ich muss mal schauen, wie ich in C# an diesen Wert herankomme. So könnte ich die Werte aus der Datenbank direkt auswerten. Meine Lösung ist noch nicht so schön. Das hilft mir schon mal sehr weiter.

Danke für die Hilfe....

5.299 Beiträge seit 2008
vor 15 Jahren

Der Bitshift Code entspricht genau dem shift Wert aus VB im KeyDown. Ich muss mal schauen, wie ich in C# an diesen Wert herankomme.

Na, andersrum shiften

Keys modifier = (Keys)(vbModifierValue << 16)

Edit: wahrscheinlich musste den vbModifier nach int vergrößern, ist alles ungetestet

Keys modifier = (Keys)((ctype(vbModifierValue, int)) << 16)

Der frühe Apfel fängt den Wurm.

S
sonnenschwester Themenstarter:in
16 Beiträge seit 2008
vor 15 Jahren

Hallo,

funktioniert jetzt und >> und << hab ich jetzt auch gecheckt. VIELEN VIELEN DANK...