Einzelnen Beitrag anzeigen

Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Programm auf eigenem "Desktop" ausführen

  Alt 1. Mär 2010, 18:33
Ich hab mir auch mal Luckies Mini-Beispiel genommen und die Fehlerbehandlung die himitsu vorgeschlagen hat eingebaut. Ergebnis: CreateProcess sagt "Datei existiert nicht" .. sie ist aber definitiv da.

Code
Delphi-Quellcode:
  procedure BaitAndSwitchDesktop;
  var
    OldDesk: HDESK;
    NewDesk: HDESK;
    pi: PROCESS_INFORMATION;
    si: _STARTUPINFOW;
  begin
    OldDesk := GetThreadDesktop(GetCurrentThreadID);
    NewDesk := CreateDesktop(PChar('Handyman'), nil, nil, 0,
      DESKTOP_CREATEWINDOW or DESKTOP_SWITCHDESKTOP or DESKTOP_CREATEMENU, nil);
    if NewDesk <> 0 then
    begin
      if SetThreadDesktop(NewDesk) = False then
        Writeln(SysErrorMessage(GetLastError));
      FillChar(si, SizeOf(si), 0);
      si.lpDesktop := 'Handyman';
      si.cb := SizeOf(si);
      si.dwFlags := STARTF_USESHOWWINDOW;
      si.wShowWindow := SW_NORMAL;
      if CreateProcess('', PChar('C:\Windows\System32\calc.exe'),
        nil, nil, False, CREATE_NEW, nil, nil, si, pi) = False then
        Writeln(SysErrorMessage(GetLastError));

      // if Windows.SwitchDesktop(NewDesk) = False then
      // Writeln(IntToStr(GetLastError));

      MessageBox(0, 'Here I am', 'Foobar Desktop', MB_ICONINFORMATION);
      if Windows.SwitchDesktop(OldDesk) = False then
        Writeln(SysErrorMessage(GetLastError));

      if SetThreadDesktop(OldDesk) = False then
        Writeln(SysErrorMessage(GetLastError));

      if CloseDesktop(NewDesk) = False then
        Writeln(SysErrorMessage(GetLastError));
    end;
    if CloseDesktop(OldDesk) = False then
      Writeln(SysErrorMessage(GetLastError));
  end;
  Mit Zitat antworten Zitat