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?