如何以模态执行另一个程序?

时间:2016-09-09 07:28:40

标签: delphi

这是我的函数,应该执行一个程序为" modal"。

function EditAndWait(const AFileName : string) : boolean;
var
  Info: TShellExecuteInfo;
begin
  FillChar(Info, SizeOf(Info), 0);
  Info.cbSize := SizeOf(Info);
  Info.lpVerb := 'edit';
  Info.lpFile := PAnsiChar(AFileName);
  Info.nShow := SW_SHOW;
  Info.fMask := SEE_MASK_NOCLOSEPROCESS;
  Result := ShellExecuteEx(@Info);
  if(Result) and (Info.hProcess <> 0) then 
  begin
    WaitForSingleObject(Info.hProcess, Infinite);
    CloseHandle(Info.hProcess);
  end;
end;

受到我last question答案的启发,我正考虑改变这个功能。 特别是,在某些情况下,ShellExecuteEx似乎没有返回句柄。

  

如果出现以下情况,您只会返回一个流程句柄:

     
      
  1. 您加入了SEE_MASK_NOCLOSEPROCESS
  2.   
  3. 函数调用成功,
  4.   
  5. 通过创建新流程解决了该问题。
  6.         

    ...

         
        

    通过创建新流程解决了该问题。

      
         

    嗯,完全有可能通过解决shell动作   重新循环现有流程。在这种情况下,您可能不会被退回   进程句柄。这会因为你而对你的代码产生影响   没有什么可以等待,没关系没有关闭的句柄。你只是   必须接受这种情况超出你的范围。

我想知道是否有办法确保我的申请被阻止&#34;直到另一个程序关闭。

1 个答案:

答案 0 :(得分:-1)

您可以尝试使用DisableTaskWindows()和EnableTaskWindows()锁定应用程序主窗体;

var 
  Windowslist : pointer;

WindowsList := DisableTaskWindows(0);
try
  // Do something ...
finally
  EnableTaskWindows(WindowsList);
end;