16,748
社区成员
发帖
与我相关
我的任务
分享
var
StartupInfo :TStartupInfo;
ProcessInfo :TProcessInformation;
sFileName:string;
FirstTickCount: Longint;
FDesktop:HDESK;
begin
FDesktop:=CreateDesktop('MyDesk',nil,nil,0,GENERIC_ALL,nil);
sFileName:='D:\Program Files\Kingsoft\PowerWord Lite\XDict.exe';
FillChar(StartupInfo,SizeOf(TStartupInfo),0);
StartupInfo.cb := SizeOf(TStartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.lpDesktop :=PChar('MyDesk');
//StartupInfo.wShowWindow := SW_HIDE;
if CreateProcess(PChar(sFileName), nil, nil, nil, false,
CREATE_NO_WINDOW or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
begin
//SwitchDesktop(FDesktop);
FirstTickCount := GetTickCount();
repeat
Application.ProcessMessages;
until GetTickCount() - FirstTickCount >= 20000;
TerminateProcess(ProcessInfo.hProcess,0);
end;
self.Close;
end;
var
FDesktop:HDESK;
ProcessInfo :TProcessInformation;
....
procedure TForm1.FormShow(Sender: TObject);
var
StartupInfo :TStartupInfo;
sFileName:string;
begin
sFileName:='D:\GreenSofts\Foobar2000\foobar2000.exe';
FillChar(StartupInfo,SizeOf(TStartupInfo),0);
StartupInfo.cb := SizeOf(TStartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
FDesktop:=CreateDesktop('MyDesk',nil,nil,0,GENERIC_ALL,nil); //创建虚拟桌面 'MyDesk'
StartupInfo.lpDesktop := PChar('MyDesk');
//创建进程调用外部程序sFileName
if CreateProcess( nil,PChar(sFileName), nil, nil, false,
NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
begin
tmr1.Interval:=20000;
tmr1.Enabled:=True;
end;
end;
procedure TForm1.tmr1Timer(Sender: TObject);
begin
tmr1.Enabled:=False;
TerminateProcess(ProcessInfo.hProcess,0); //结束创建的进程
CloseDesktop(FDesktop); //关闭创建的虚拟桌面
Application.Terminate; //退出主程序
end;
var
StartupInfo :TStartupInfo;
ProcessInfo :TProcessInformation;
sFileName:string;
FirstTickCount: Longint;
begin
sFileName:='mubox.exe';
FillChar(StartupInfo,SizeOf(TStartupInfo),0);
StartupInfo.cb := SizeOf(TStartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_HIDE;
if CreateProcess(PChar(sFileName), nil, nil, nil, false,
Create_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
begin
FirstTickCount := GetTickCount();
repeat
Application.ProcessMessages;
until GetTickCount() - FirstTickCount >= 20000;
TerminateProcess(ProcessInfo.hProcess,0);
end;
self.Close;
end;
var
StartupInfo :TStartupInfo;
ProcessInfo :TProcessInformation;
sFileName:string;
FirstTickCount: Longint;
begin
sFileName:='mubox.exe'; //外部程序名,不在同目录下要加路径
FillChar(StartupInfo,SizeOf(TStartupInfo),0);
StartupInfo.cb := SizeOf(TStartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_HIDE;
if CreateProcess(PChar(sFileName), nil, nil, nil, false,
Create_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
begin
sleep(20000); //等待20秒,会另主程序挂起,可以用其它方法避免挂起
TerminateProcess(ProcessInfo.hProcess,0);
self.Close;
end;
end;