Mehrere Tastendrücke abfragen
-
Sollte eigentlich mit der WINAPI Funktion GetKeyState(virtualKeycode) gut zu lösen sein.
-
und, kannst du mir da mal ein beispiel geben bitte?
-
Das sollte im Onkey Event gehen
- einen String anlegen der die zulässigen Tasten enthält (mat)
- einen static zähler mit 0 initialisieren
- prüfen, ob die augenblickliche Taste dabei ist
- wenn ja zahler um 1 erhöhen
- wenn nein zähler auf 0 setzen
- wenn zähler 3 dann sind wohl alle drei tasten gedrückt worden -> das machen was du willst und zähler wieder auf 0Es gibt übrigens kein "gleichzeitig". Tasten werden immer nacheinander gedrückt, auch wenn die Zeitunterschiede im Mikrobereich liegen. Demzufolge werden die Events auch nacheinander ausgelöst.
-
Christian211 schrieb:
- einen String anlegen der die zulässigen Tasten enthält (mat)
- einen static zähler mit 0 initialisieren
- prüfen, ob die augenblickliche Taste dabei ist
- wenn ja zahler um 1 erhöhen
- wenn nein zähler auf 0 setzen
- wenn zähler 3 dann sind wohl alle drei tasten gedrückt worden -> das machen was du willst und zähler wieder auf 0Das würde allerdings auch bei einem a-a-a anspringen
besser wäre es vermutlich, jeden "legalen" Tastendruck in ein Array zu speichern und dann vor Schritt 5 nochmal zu überprüfen, ob alle erwarteten Tasten dort drinstehen.
(und wenn du mehrere solcher Kombinationen hast, wird es richtig kompliziert ;))
-
joo, Logikfehler
-
Dann hab ich gleich noch einen.

Man muß die Überprüfung im OnKeyDown-Event machen und im OnKeyUp-Event alles zurücksetzen, sonst wird die Funktion auch ausgelöst, wenn man die nacheinander drückt.
-
Na dann wird das ja bald die perfekte Lösung
-
Eine Funktion schreiben:
void keineAhnung(void) { while(1) { Application->ProcessMessages(); if((GetKeyState(TastenCode von m)=!1 && GetKeyState(TastenCode von m)=!0) &&(GetKeyState(TastenCode von a)=!1 && GetKeyState(TastenCode von a)=!0) &&(GetKeyState(TastenCode von t)=!1 && GetKeyState(TastenCode von t)=!0)) //tue irgendwas } }Die Funktion denn in Form-Aktivate aufrufen.
Und bitte nicht meckern wenn es schlecht ist, aber so hätte ich es gemacht.
/Edit: Ups, wenn denn muss da nen und hin. Danke an CStoll
-
Sorry, aber die Funktion blockiert die ganze Anwendung durch die while Schleife. Warum nicht in den Events, die hier angesprochen wurden.
-
Also nach meinen Erfahrungen läuft das Programm weiter normal, aber mir ist gerade aufgefallen, dass die Aktion denn ziehmlich oft ausgeführt wird, wenn man die Tastenkombination drückt.
Der einzige Nachtteil der anderen Möglichkeit ist nach meiner Meinung eigentlich nur die Umständlichkeit der Realisierung...
-
Ja, durch das Application->ProcessMessages(); ist aber keine glückliche Lösung.
Was ist an den anderen Lösungen umständlich? Bloß weil es 2 Events sind?
Naja, jedem das seine

-
Seth_99 schrieb:
if((GetKeyState(TastenCode von m)=!1 || GetKeyState(TastenCode von m)=!0) ...)Also wenn ich mir nur diese Zeile ansehe, wird mir schon schwindlich - von diesen beiden Vergleichen ist mit Sicherheit einer wahr, damit reduziert sich deine Überprüfung auf ein impliziztes "if(true)..." und ist letztendlich sinnlos.