Normalerweise kann man das aus einem Service so machen (DoScreenshot ist eine ganz normale Screenshot Routine).
IMHO funktioniert das aber nur aus einem eigenen Thread - denn die Zuordnung Thread <-> Desktop ist 1:1!
Delphi-Quellcode:
//------------------------------------------------------------------------------
procedure TThreadScreenShot.Execute;
//------------------------------------------------------------------------------
// Thread ausführen
//------------------------------------------------------------------------------
var
hDesktop : HDESK;
hWinstation : HWINSTA;
pDesktopName : array[0..255] of char;
Desktopname : string;
dwLen : DWORD;
begin
hWinstation := OpenWindowStation('winsta0', true, GENERIC_ALL);
if hWinstation <> 0 then
begin
if SetProcessWindowStation(hWinstation) then
begin
GetUserObjectInformation(OpenInputDesktop(0, false, GENERIC_ALL), UOI_NAME, @pDesktopname, 256, dwLen);
SetString(DesktopName, pDesktopName, dwLen-1);
hDesktop := OpenDesktop(PAnsiChar(Desktopname), 0, false, GENERIC_ALL);
if hDesktop <> 0 then
begin
if SetThreadDesktop(hDesktop) then
begin
DoScreenShot(DesktopName);
end;
CloseDesktop(hDesktop);
end;
end;
CloseWindowStation(hWinstation);
end;
end;