小弟用ShellExecuteEx 或 CreateProcess调用外部程序,想在外部程序运行期间原程序便不能做任何事情(效果像Enabled=false),在外部程序结束后,原程序恢复正常.我用WaitForSingleObject,但是当外部程序运行期间,原程序的窗口(外部程序在原程序覆盖过的地方)便变成白色区域。请问有没有好的解决方案。

解决方案 »

  1.   

    Function WinExecExW(cmd,workdir:pchar;visiable:integer):DWORD;
    var
     StartupInfo:TStartupInfo;
     ProcessInfo:TProcessInformation;
    begin
     FillChar(StartupInfo,SizeOf(StartupInfo),#0);
     StartupInfo.cb:=SizeOf(StartupInfo);
     StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
     StartupInfo.wShowWindow:=visiable;
     if not CreateProcess(nil,cmd,nil,nil,false,Create_new_console or Normal_priority_class,nil,nil,StartupInfo,ProcessInfo) then
       result:=0
     else
     begin
       waitforsingleobject(processinfo.hProcess,INFINITE);
       GetExitCodeProcess(ProcessInfo.hProcess,Result);
     end;
    end;
      

  2.   

    谢谢 l0f(凌风) 的提议
    我按照此方法写的函数:
    还有没有其他方法,请提宝贵建议{调用函数ExecuteApplication(Cmd:PChar;FormHandle:THandle);
    其中,Cmd为要调用的程序令行,FomrHandle为调用外部应用程序的窗口句柄}unit ExecuteApp;interfaceuses
        windows;
    var
        ExecuteApplicationCmd:PChar;
        ExecuteApplicationHandle:THandle;procedure ExecuteApplication(Cmd:PChar;FormHandle:THandle);implementationfunction ExecuteAndWaitForCompletion:boolean;
    var
        si:StartupInfo;
        pi:Process_information;
    begin
        EnableWindow(ExecuteApplicationHandle,false);
        ZeroMemory(@si,sizeof(StartupInfo));
        si.cb:=sizeof(StartupInfo);
        si.dwFlags:=Startf_useshowwindow;
        si.wShowWindow:=SW_SHOWNORMAL;
        result:=CreateProcess(nil,ExecuteApplicationCmd,nil,nil,true,Normal_Priority_Class,GetEnvironmentStrings(),nil,si,pi);
        WaitForSingleObject(pi.hProcess,INFINITE);
        CloseHandle(pi.hProcess);
        CLoseHandle(pi.hThread);
        EnableWindow(ExecuteApplicationHandle,true);
    end;procedure ExecuteApplication(Cmd:PChar;FormHandle:THandle);
    var
        hThread:THandle;
        ThreadID:DWord;
    begin
        ExecuteApplicationCmd:=Cmd;
        ExecuteApplicationHandle:=FormHandle;
        hThread:=CreateThread(nil,0,@ExecuteAndWaitForCompletion,nil,0,ThreadID);
        if hThread=0 then
            messagebox(0,'No Thread',nil,mb_ok);
    end;end.
      

  3.   

    我用shellexecute挺好的,但不知是否与你的应用相符。
      

  4.   

    cnssk(小柯) 
    你写的程序就范我所说的情况
    自己试一试
      

  5.   

    leixg(雷锋)
    谢谢你的参与
    ShellExecute的功能过于简单
    不能满足要求
      

  6.   

    function WinExecAndWait(FileName:String; Visibility : integer):Thandle;
    var
      zAppName:array[0..512] of char;
      zCurDir:array[0..255] of char;
      WorkDir:String;
      StartupInfo:TStartupInfo;
      ProcessInfo:TProcessInformation;
    begin
    StrPCopy(zAppName,FileName);0D
    GetDir(0,WorkDir);
    StrPCopy(zCurDir,WorkDir);
    0AFillChar(StartupInfo,Sizeof(StartupInfo),#0);
    StartupInfo.cb := Sizeof(StartupInfo);
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := Visibility;
    if not CreateProcess(nil,zAppName,nil,nil,false,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,ProcessInfo) then
      begin
      Result :=0;
      exit;
      end
      else
      begin
      WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
      GetExitCodeProcess(ProcessInfo.hProcess,Result);
      end;
    end;
    //下面是用法:
    WinExecAndWait('NotePad.exe',SW_Normal);用CreateProcess运行程序,然后用下面的语句等待其结束
        WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
        GetExitCodeProcess(ProcessInfo.hProcess,Result);
      

  7.   

    大家都是用这种方法 :(  
    因该没有别的了 hehe^^