Einzelnen Beitrag anzeigen

hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#2

AW: Hook aus Service

  Alt 16. Mai 2012, 12:16
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.
Heinz Schneider
  Mit Zitat antworten Zitat