作者:
陆岛工作室
type
TExecState = (esNormal, esMinimized, esMaximized, esHidden);
function ExecuteFileWait(Handle: HWND; const FileName, Params, StartDir: string; InitialState: TExecState): Integer;
{
Handle: 传入当前窗口或 Applicaton 的句柄
FileName: 需要传入的文件名
Params: 执行文件所带的参数
StartDir: 执行文件启动路径
InitialState: 窗口显示模式
}
实现代码如下:
{
ExecuteFileWait
}

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
;