Para documentar con código lo que expuse anteriormente propongo una función para apropiarse del escritorio que usa el sistema por defecto en un momento dado:
Código Delphi
[-]
const WINSTA_ALL_ACCESS = $37F;
procedure SetDefaultWSDesktop;
var
hWSTA: HWINSTA;
hDSK: HDESK;
begin
hWSTA:= OpenWindowStation('winsta0', true, WINSTA_ALL_ACCESS);
if hWSTA<>0 then
if SetProcessWindowStation(hWSTA) then CloseWindowStation(hWSTA);
hDSK:= OpenInputDesktop(0, true, GENERIC_ALL);
if hDSK <> 0 then
if SetThreadDesktop(hDSK) then CloseDesktop(hDSK);
end;
A la hora de capturar conviene antes repetir la secuencia:
Código Delphi
[-]
var
hDSK: HDESK;
begin
hDSK:= OpenInputDesktop(0, true, GENERIC_ALL);
if hDSK <> 0 then
if SetThreadDesktop(hDSK) then CloseDesktop(hDSK);
......
Tu aplicación residente en el PC remoto deberá ser un servicio, como forma más fácil de correr como SYSTEM, pero con la dificultad de acceder al GUI. También podrá ser una simple App que se lance desde un servicio, por lo que será SYSTEM también.
Para completar, conviene revisar los siguientes enlaces
Lanzar una aplicación GUI desde un servicio y
MiniSystem, una miniaplicación para ejecutar programas con privilegios SYSTEM, que te aclararan conceptos y te darán pautas para realizar lo que pretendes.
Saludos.