Delphi. Запуск чужого приложения из своего сервиса?
Сервис — он не от пользователя работает. И при работе сервиса нет такого понятия как «активный» рабочий стол, ведь ни для кого не секрет что можно открывать одновременно несколько учетных записей в данный момет времени, первая допустим основная, локально с компа, а вторая — через RDP, вот и получается что нет «активного» рабочего стола, а есть (скорее всего) список запущенных учетных записей из них уже и надо получать хэндл рабочего стола. Не знаю как вы пропустили этот момент, когда читали про сервисы, но я точно помню что реализовано это именно так. Советую почитать про Сервисы и Драйвера в Windows.
function ExecAndWait(const FileName,
                     Params: ShortString;
                     const WinState: Word): boolean; export;
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: ShortString;
begin
  { Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x }
  CmdLine := '"' + Filename + '" ' + Params;
  FillChar(StartInfo, SizeOf(StartInfo), #0);
  with StartInfo do
  begin

    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WinState;
  end;
  Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo);
  { Ожидаем завершения приложения }
  if Result then
  begin
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    { Free the Handles }
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

  ExecAndWait( 'C:\windows\notepad.exe', '', SW_SHOWNORMAL);
end;
</code>

попробуйте :)