Ich habe jetzt den Fehler eingegrenzt, und bin auf ein ganz überraschendes Ergebnis gekommen.
Ich habe meine Hookprozedur schrittweise von einer ganz leeren Prozedur weg aufgebaut. Zur Kontrolle, ob mein Hook noch da ist, macht er jedesmal ein beep, wenn er aufgerufen wird. Damit habe ich überprüft, dass das Laden der
DLL und die Installation des Hooks wirklich funktioniert.
Sobald ich in meiner Hook-Prozedur einen Timer aktiviere (der gar nichts tut), verabschiedet sich der Hook, wenn er über eine nicht lokale Taste aktiviert wird:
ALSO:
Solange ich Timer1.enabled auskommentiere, habe ich einen globalen Hook, der einwandfrei funktioniert, ich kann auch Tastaturereignisse in die Tatstaurqueue absetzen, die dort richtig ankommen, egal ob ich der Fokus in meinem Testprogramm oder in einem ganz anderen Programm liegt.
Sobald ich diese Programmzeile mitkompiliere, funktioniert der Hook noch immer einwandfrei, wenn ich Tastatureingaben in das Fenster des Testprogramms mache, das die
DLL geladen hat. Wenn ich aber eine einzige Tastatureingabe in ein Fenster ausserhalb dieses Programms mache, gibt es für diese Taste noch einmal einen letzten Beep, der mir sagt, die Hookroutine wird aufgerufen. Weitere Tastatureingaben, egal ob in das Fenster meines Testprogrammes oder in ein anderes, produzieren kein Geräusch mehr, d.h. meine Hookroutine ist fortan nicht mehr in der Hook-Kette drinnen.
Wenn das passiert ist, schlägt nachher auch UnhookWindowsHookEx fehl!
In der Prozedur Timer1Timer ist der einzige Befehl: timer1.enabled := false, der Timer tut also im Moment gar nichts. Ist irgend etwas über eine Inkompatibilität zwichen der delphi Timerkomponente und globalen Hooks bekannt?