Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
Delphi XE2 Professional
|
Re: Programm auf eigenem "Desktop" ausführen
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;
|
|
Zitat
|