Wie kann ich herausfinden, ob der Anwender im Augenblick eine bestimmte Taste auf der Tastatur drückt? Und als Bonus: das gleiche für Maustasten bitte!
Was ich bisher weiß:
- Die WinAPI ist ereignisorientiert; sie sendet mir WM_KEYDOWN und WM_KEYUP (und die entsprechenden Mausnachrichten). Das ist aber scheiße kompliziert: Ich muss ein Array von Zuständen für alle virtuellen Tasten vorhalten und bei jeder Nachricht entsprechend aktualisieren. Dann kommen tausend Sonderfälle, wie: Anwender drückt in meiner Anwendung eine Taste und wechselt zu einer anderen Anwendung, bevor er sie wieder loslässt.
Do. Not. Want. - GetAsyncKeyState() gibt mir den Tasten-/Mauszustand immer – auch, während der Anwender garnicht mehr in meiner Anwendung ist. Klick auf ein Fenster auf dem anderen Bildschirm – Magazin leergeschossen. Ich müsste also testen, ob mein Fenster noch im Vordergrund ist. Wie schnell reagiert Windows bei sowas? Wenn der Anwender auf ein Fenster klickt während ich mitten in der Abfrage bin, habe ich dann noch Fokus oder nicht? Außerdem soll man GetKeyState() verwenden, weil viele Virenscanner bei der asynchronen Version einen Keylogger vermuten.
- GetKeyState() – wie GetAsyncKeyState(), nur schlimmer. Hier wird der Zustand gemäß dem Abarbeitungsfortschritt meines Nachrichtenstapels zurückgegeben. Was soll ich da machen? Nach jeder verarbeiteten Nachricht aufs Neue prüfen? Oder alle Nachrichten durchkauen und dann erst prüfen? Funktioniert das, wenn man schneller klickt und wieder loslässt als die Frequenz der Eingabeverarbeitung ist?
- Raw Input. Schon länger her, dass ich damit gearbeitet habe – darum wäre es schön, wenn jemand seine Erfahrungen mit mir teilen könnte. Soweit ich das in Erinnerung habe, brauche ich die Zeit und die Textmenge, die ich bei den drei Punkten zuvor ins Stopfen der Löcher stecken müsste, hier schon für Initialisierung und Kapselung. Ist es das zumindest wert?
- DirectInput. Microsoft sagt: Finger weg und stattdessen die Windows-Nachrichtenschleife nutzen.
Gruß, Ky