@CUser1 sagte in Problem mit KeyHook:
@hustbaer Achso es funktioniert eh mit GetAsyncKeyState auch nicht, wenn ich nur ganz kurz auf der Taste bin.
Korrekt.
Bzw. genau genommen funktioniert es schon: Bit 0 des Returnwertes ist 1 wenn die Taste irgendwann zwischen dem letzten Aufruf von GetAsyncKeyState gedrückt wurde -- auch wenn sie dazwischen wieder losgelassen wurde. Blöd ist nur wenn auch noch jemand anderes GetAsyncKeyState verwendet. Dann funktioniert der Spass nicht mehr.
Das steht aber auch alles in der Doku: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getasynckeystate
Das ist nervig, dann führt doch nichts über die Key_Down und bool Variante herum weil ich sonst immer auf der Taste sein muss, wenn gerade getKeyState aufgerufen wird,
Naja, doch, ist eigentlich ganz einfach: ignoriere es. Machen viele Spiele und es ist kaum jemals ein Problem.
Läuft der Treiber ganze Zeit im Hintergrund wie ein normaler Prozess und wartet auf Eingaben oder wie?
Das kommt auf den Treiber drauf an und was du genau unter "läuft im Hintergrund" meinst. Der Treiber ist auf jeden Fall immer geladen (existiert im Speicher). Aber bei den meisten Geräten ist es nicht erforderlich permanent irgendwas zu pollen oder so. Üblicherweise löst ein Gerät einen Interrupt aus wenn es etwas braucht bzw. zu melden hat. Durch so einen Interrupt wird dann irgendein gerade laufender Thread unterbrochen, in den Kernel-Mode gewechselt und der Interrupt-Handler ausgeführt. Dort plaudert der Treiber dann mit dem Gerät und leitet z.B. die Info ans Betriebssystem weiter dass jetzt eine Taste gedrückt wurde. Weil der Treiber nett ist beeilt er sich dabei, und gibt dann Kontrolle wieder an den unterbrochenen Thread zurück.
Und in Windows ist irgendein Prozess dann wiederrum irgendwann damit beschäftigt die aufzuarbeiten?
Jain. Es gibt natürlich den sogenannten "System" Prozess. Der bearbeitet aber nicht alles was Treiber so machen. Einige Dinge werden vom Treiber auch mehr oder weniger direkt an einen bestimmten Prozess geschickt. Natürlich ist dabei auch das Betriebssystem im Spiel, aber nicht notwendigerweise der "System" Prozess.
Ist der explorer.exe für das alles zuständig?
Nein. Windows läuft wunderbar ohne dass explorer.exe läuft oder auch nur auf der HDD/SSD vorhanden ist.
Mir ist außerdem aufgefallen, dass GetAsyncKeyState auch anschlägt wenn ein anderes Window aktiv ist. Das heißt ein Buchstabe wird an alle Messagequeues von allen Threads gesendet.
Ja, GetAsyncKeyState geht auch wenn ein anderes Fenster aktiv ist. Nein, das heisst nicht dass ein Buchstabe an alle Messagequeues von allen Threads gesendet wird. Es heisst dass GetAsyncKeyState nicht auf irgendwelche Messages angewiesen ist. Windows selbst hat quasi einen Puffer wo es sich für jede Taste den aktuellen Zustand merkt. GetAsyncKeyState fragt diesen Zustand dann ab.
D.h. ein Tastendruck wird vom Treiber erstmal an Windows geschickt. Windows merkt sich dann den aktuellen Zustand der Taste, und erzeugt dann die nötige Input-Message für den Thread der gerade den Input-Fokus hat.
Wenn du die Maus bewegst funktioniert das ähnlich. Jedes Programm kann jederzeit wenn es möchte die Mausposition abfragen. Das heisst aber nicht dass bei jeder Mausbewegung sämtliche Programme bzw. Fenster benachrichtigt würden.