function ExecuteFileWait(Handle: HWND; const FileName, Params, StartDir: string; InitialState: TExecState): Integer; const ShowCommands: array[TExecState] of LongInt = (SW_SHOWNORMAL, SW_MINIMIZE, SW_SHOWMAXIMIZED, SW_HIDE); var Info: TShellExecuteInfo; ExitCode: DWORD; FActive: HWND; begin FillChar(Info, SizeOf(Info), 0); Info.cbSize := SizeOf(TShellExecuteInfo); with Info do begin fMask := SEE_MASK_NOCLOSEPROCESS; Wnd := Application.MainForm.Handle; lpFile := PChar(FileName); lpParameters := PChar(Params); lpDirectory := PChar(StartDir); nShow := ShowCommands[InitialState]; end; FActive := GetActiveWindow;
if ShellExecuteEx(@Info) then begin EnableWindow(Handle, False); repeat Application.ProcessMessages; GetExitCodeProcess(Info.hProcess, ExitCode); until (ExitCode <> STILL_ACTIVE) or Application.Terminated; EnableWindow(Handle, True); ShowWindow(Handle, SW_SHOW); SetActiveWindow(FActive); SetForegroundWindow(FActive); Result := ExitCode; end else Result := -1; end;
示范:
begin ExecuteFileWait(Application.Handle, 'C:\Windows\NotePad.EXE', 'C:\A.txt', '', esMaximized); ShowMessage('OK! 程序已退出!'); end;