我现在尝试支持的应用程序(我以前创建的)完全是一团糟,所以我将它的扩展编程为一个单独的可执行文件,然后我启动、调用application.minimize;
和WaitForSingleObject
(最近创建的进程)。在那之后,我打电话application.restore
让我回到我离开的地方。
application.Minimize;
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
Application.Restore;
Application.BringToFront;
BringToFront; //the topmost form which was used to launch the app
Show;
然后我可以看到(Win XP),如何描述它?,应用程序的框架从任务栏跳起来,好像应用程序正在恢复到屏幕,但它实际上并没有显示。如您所见,我非常绝望并结合了app.restore,app.bringtofront,form.bringtofront,form.show ...但我想我需要某种application.show,activate,focus ...不能似乎找到了那些。
另外,为什么这还不够?
application.Minimize;
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
Application.Restore;
编辑
主要形式是wsMaximized
,这个调用anotherform.showmodal;
最终会尝试最小化应用程序,启动其他进程并恢复应用程序。我认为诀窍在于最顶层形式的 MODALity。
显示为模式的其他(最顶层)表单的示例代码:
function ExecAndWait(const FileName, Params: string;
WindowState: Word): Boolean;
var
SUInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: string;
begin
{ Enclose filename in quotes to take care of
long filenames with spaces. }
CmdLine := '"' + FileName + '" ' + Params;
FillChar(SUInfo, SizeOf(SUInfo), #0);
with SUInfo do
begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := WindowState;
end;
Result := CreateProcess(nil, PChar(CmdLine), nil, nil, False,
CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS, nil,
PChar(ExtractFilePath(FileName)),
SUInfo, ProcInfo);
{ Wait for it to finish. }
if Result then
begin
application.Minimize;
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
Application.Restore;
Application.BringToFront;
end;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
ExecAndWait('C:\Windows\system32\mspaint.exe' , '' , SW_NORMAL);
end;