Delphi-Quellcode:
uses Registry;
//aktuellen Screensaver auslesen
function getSs: String;
function ExtractLongPathName(FileName: String): String;
var
F: TSearchRec;
begin
if FindFirst(FileName, faAnyFile, F) = 0 then
Result := IncludeTrailingPathDelimiter(ExtractFilePath(FileName)) + F.Name
else
Result := '';
FindClose(F);
end;
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('\Control Panel\Desktop', False) then
begin
Result := Reg.ReadString('SCRNSAVE.EXE');
Reg.CloseKey;
end
else
Result := '';
if Result <> '' then
Result := ExtractLongPathName(Result);
finally
Reg.Free;
end;
end;
Ich habe im Moment nicht den Überblick auf welchen Windows-Versionen das so klappt...
Diese Funktion versucht anhand des Dateinamens einer Anwendung die Prozess-ID herauszufinden. Läuft kein Prozess mit diesem ExeNamen, gibt die Funktion 0 zurück.
Delphi-Quellcode:
function GetProcessIdByExeName(const AExeName: string): Cardinal;
var
SnapShot: THandle;
p: TProcessEntry32;
begin
Result := 0;
p.dwSize := SizeOf(p);
SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if SnapShot = INVALID_HANDLE_VALUE then RaiseLastOSError;
try
if Process32First(SnapShot, p) then
repeat
if AnsiLowerCase(AExeName) = AnsiLowerCase(p.szExeFile) then
Result := p.th32ProcessID;
until (Result <> 0) or not Process32Next(SnapShot, p);
finally
CloseHandle(SnapShot);
end;
end;
In Kombination kannst du so prüfen, ob der aktuelle Standard-Bildschirmschoner gerade den Bildschirm schont.
Ich habe aber irgendwie noch im Hinterkopf, dass es einen besseren Weg gibt, um zu prüfen, ob gerade ein Bildschirmschoner läuft. Ich kann aber auf die schnelle nichts finden.
Grüße
Malte