在我的应用程序(Delphi XE10)中,我想用用户的默认编辑器(MSword或OpenOffice writter或其他)打开文件(RTF),并能够从我的应用程序关闭此编辑器。 我试图使用下面的代码,但没有成功关闭编辑器
procedure TForm1.Button1Click(Sender: TObject);
var hApp : Cardinal;
begin
hApp := StartApp('open','temp.rtf','','',sw_normal);
anotherForm.showmodal;
KillProcess(hApp);
end;
其中:
function StartApp(apchOperation, apchFileName, apchParameters, apchDirectory: PChar;awrdShowCmd: Word): Cardinal;
var
lseiInfo: TShellExecuteInfo;
begin
Result := 0;
FillChar(lseiInfo, SizeOf(lseiInfo), Chr(0));
lseiInfo.cbSize := SizeOf(lseiInfo);
lseiInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
lseiInfo.lpVerb := apchOperation;
lseiInfo.lpFile := apchFileName;
lseiInfo.lpParameters := apchParameters;
lseiInfo.lpDirectory := apchDirectory;
lseiInfo.nShow := awrdShowCmd;
if Boolean(ShellExecuteEx(@lseiInfo)) then
Result := lseiInfo.hProcess;
end;
procedure KillProcess(hProcess: Cardinal);
Var
ovExitCode: LongWord;
begin
try
if hProcess <> 0 then begin
GetExitCodeProcess(hProcess, ovExitCode);
if (ovExitCode = STILL_ACTIVE) or (ovExitCode <> WAIT_OBJECT_0) then
TerminateProcess(hProcess, ovExitCode);
CloseHandle(hProcess);
end;
except
end;
end;
编辑器打开但是当它必须用KillProcess关闭时,ovExitCode总是为零,所以TerminateProcess不会执行。我也尝试在任何情况下执行TerminateProcess,但编辑器(在这种情况下为MSword)不会关闭。
你能帮帮我吗? 提前谢谢答案 0 :(得分:1)
我建议删除KillProcess
方法并使用SendMessage()
代替WM_CLOSE。这样您的应用程序将以“正常”方式退出。您可以从流程句柄获取窗口句柄,如下所述:https://stackoverflow.com/a/20163705/3936440