Habe gesehen, dass eigentlich die HookOn-Procedure auch in einer abgespeckten Version noch gleichermassen funktioniert:
Code:
procedure HookOn ; stdcall;
var hWinStaUser : HWINSTA;
var hUInputDT : HDESK;
begin
hWinStaUser := OpenWindowStation('WinSta0', FALSE, MAXIMUM_ALLOWED);
if (SetProcessWindowStation(hWinStaUser)) then
begin
hUInputDT := OpenInputDesktop(0, False, MAXIMUM_ALLOWED);
if (SetThreadDesktop(hUInputDT)) then
begin
HookTastatur := SetWindowsHookEx(WH_KEYBOARD_LL, @CallBackDelHook, HInstance , 0);
Writelog('Hook gesetzt');
end
else
Writelog('Hook nicht gesetzt');
end;
end;
Aber das Problem bleibt dasselbe: Der SetThreadDesktop funktioniert nur einmal. Und inzwischen habe ich auch herausgefunden, weshalb: Bei Microsoft ist noch folgende Korrektur zu finden:
Zitat:
errata
"The SetThreadDesktop function will fail if the calling thread has any windows or hooks on its current desktop"
This is understated. SetThreadDesktop will fail if the calling thread has ever had a window or hook on its current desktop.
Nun meine Frage: Hat jemand eine Idee, wie man:
- den SetWindowsHookEx auf andere Art auf den richtigen Desktop leiten kann oder
- Windows beibringen kann, dass der Thread gar nie einen Hook hatte
Habe bereits versucht, vom Dienst einfach die
DLL neu zu laden (FreeLibrary und LoadLibrary) aber das geht offenbar zu schnell, resp. es scheint so als ob beim Load immer noch der alte
DLL-Tread aktiv ist. Jedenfalls läuft die begin - end - Sequenz der
DLL beim Neuladen nicht ab.