Einzelnen Beitrag anzeigen

hesch21

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

AW: Tastaturhook auf Bildschirmschoner

  Alt 15. Jun 2012, 14:38
Zitat:
Nicht mehr "so einfach", aber durchaus machbar. Die einfachste Möglichkeit, die mir einfällt: madCodeHook. Kostet zwar, spart aber unglaublich Nerven.
madCodeHook arbeitet mit einem Treiber. Ich bin soeben mit einem KeyBoardFilterTreiber, den ich trotz MS-SDK und MS-Unterstützung nicht stabil zum laufen gebracht habe und der ausserdem von allen Antivirus-Programmen als SpyWare erkannt wurde, ein gebranntes Kind. Ich werde mich deshalb hüten, für etwas (ziemlich viel) Geld auszugeben, wenn man davon nicht mal eine Demoversion haben kann.

Weshalb ich aber den Thread nochmals ausgrabe ist natürlich klar. Ich stehe immer noch an. Ich habe es zwar nach langem geschafft, herauszufinden, welcher Screen Saver überhaupt in Betrieb ist und wo der liegt. Wenn jemand interessiert, hier der Code:
Code:
{Prozess-Name aus Prozessliste auslesen}
function GetProcessName(PID: DWORD; var ProcessName, ProcessPfad: string): DWORD;
var dwReturn     : DWORD;
var hProcSnapShot : THandle;
var hModSnap     : THandle;
var pe32          : TProcessEntry32;
var ME32          : TModuleEntry32;
begin
  dwReturn := 0;
  hProcSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if hProcSnapShot <> INVALID_HANDLE_VALUE then
     begin
     pe32.dwSize := sizeof(TProcessEntry32);
     if Process32First(hProcSnapShot, pe32) then
        begin
        if PID = pe32.th32ProcessID then
           ProcessName := pe32.szExeFile;
        if ProcessName <> '' then
           begin
           while Process32Next(hProcSnapShot, pe32) do
                 begin
                 if PID = pe32.th32ProcessID then
                    begin
                    ProcessName := pe32.szExeFile;
                    hModSnap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PE32.th32ProcessID);
                    if hModSnap <> INVALID_HANDLE_VALUE then
                       begin
                       ME32.dwSize := SizeOf(TModuleEntry32);
                       if Module32First(hModSnap, ME32) = True then
                          ProcessPfad := ME32.szExePath;
                       end;
                    CloseHandle(hModSnap);
                    break;
                    end;
                 end;
           end;
        end
     else
       dwReturn := GetLastError;
     CloseHandle(hProcSnapShot);
     end
  else
     dwReturn := GetLastError;
  result := dwReturn;
end;

{Prozessliste laden}
function GetProcessList(var ProcessList: TPIDList): DWORD;
var dwReturn     : DWORD;
var hProcSnapShot : THandle;
var pe32          : TProcessEntry32;
var j            : Cardinal;
begin
  dwReturn := 0;
  hProcSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if hProcSnapShot <> INVALID_HANDLE_VALUE then
     begin
     pe32.dwSize := sizeof(TProcessEntry32);
     j := 0;
     setlength(ProcessList, j + 1);
     if Process32First(hProcSnapShot, pe32) then
        begin
        ProcessList[j] := pe32.th32ProcessID;
        while Process32Next(hProcSnapShot, pe32) do
              begin
              Inc(j);
              setlength(ProcessList, j + 1);
              ProcessList[j] := pe32.th32ProcessID;
              end;
        end
     else
        dwReturn := GetLastError;
     CloseHandle(hProcSnapShot);
     end
  else
     dwReturn := GetLastError;
  result := dwReturn;
end;
man erhält Name und Pfad aller Prozesse und braucht nur noch nach '.SCR' zu filtern. Ist natürlich nicht alles von mir sondern 'zusammengklaut'.

Aber wie starte ich das Ding nun wieder aus dem Dienst heraus? Vorab, mit CreateProcessAsUser habe ich es auf allen drei Desktop-Varianten versucht und mit CreateProcessAsUser kenne ich mich einigermassen aus. Derselbe Dienst startet nämlich mehrere andere Prozesse, unter anderem auch auf Winlogon. Aber vermutlich muss der Screen Saver unter dem Benutzer laufen, der aktiv war, als er gestartet wurde.

Hat ja jemand noch eine Idee?
Heinz Schneider

Geändert von hesch21 (15. Jun 2012 um 14:41 Uhr)
  Mit Zitat antworten Zitat