做了个程序需要运行启动一个外部程序,,如何隐藏启动那个外部程序,用 ShellExecute()和WinExec()都无法隐藏启动那个程序,,请高手们帮下忙,谢谢了!

解决方案 »

  1.   

    Shellexecute的最后一个参数设置成SW_HIDE
      

  2.   

    Shellexecute的最后一个参数设置成SW_HIDE 不管用。隐藏不了啊
      

  3.   

    请你说出你要启动的文件位置说出来哦shellexecute(0,'open','位置',nil,nil,nil,sw_hide);
    或者
    shell(0,'open','cmd.exe','/c 位置',nil,nil,sw_hide);
      

  4.   

    比如我要运行 D盘的 123.exe  运行它的时候需要隐藏运行它,不是隐藏它的进程,就是他运行以后要看不到他的界面,在标题栏也不显示他可是我用shellexecute(0,'open','D:\123.exe',nil,nil,sw_hide);
    运行以后他还是可以看到得!
      

  5.   

      StartupInfo.dwFlags   :=   STARTF_USESHOWWINDOW;   
      StartupInfo.wShowWindow := SW_HIDE;
      if(CreateProcess(nil, 'project1.exe',
        nil,nil,FALSE,NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,ProcessInfo)) then
      begin
          WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
          CloseHandle(ProcessInfo.hThread);
          CloseHandle(ProcessInfo.hProcess);
      end;
      

  6.   

    是啊,我测试的都是Delphi作的程序,,,根本不能隐藏启动他,,或者用通过它的窗口句柄发送消息来隐藏他,,这样只能隐藏他的窗口,可是在任务栏还是现实
      

  7.   

    你可以试试Schedule方法。计划任务运行时,可以选项隐藏。
      

  8.   

    我是从服务程序里隐藏运行外部程序的,运行后会闪一下窗体,然后才是看不到,进程还是有的 使用ShellExecute后台运行该程序 
    shellexecute(0,'open','patch.exe','','',SW_hide); 执行后该程序也是SYSTEM权限并且闪一下才到后台运行 结果就因为这闪一下 把别人从全屏游戏里给弹出来了.... 服务程序有设置与桌面交互。 另外,我新建一个桌面应用程序测试此句 直接进后台运行,不会出现 闪现然后才转到后台,难道因为是SYSTEM权限的问题?请各位帮忙看看 
      

  9.   

    function GetProcessHandleAsName(Name: String): THandle;
    var
      Hd:THandle;
      Tmp,Tmp1:String;
      Lp:TProcessEntry32;
    begin
      Result:=0;
      Lp.dwSize:=SizeOf(TProcessEntry32);
      Hd:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
      if Process32First(Hd,Lp) then
      Repeat
        Tmp:=UpperCase(Trim(Name));
        Tmp1:=Trim(UpperCase(Lp.szExeFile));
        if AnsiPos(Tmp,Tmp1)>0 then
        begin
          Result := OpenProcess($000F0000 or $00100000 or $FFF, True, Lp.th32ProcessID);
          break;
        end
      Until Process32Next(Hd,Lp)=False;
    end;function CreateProc(ProcessName: string; SwCmd: Word): Boolean;
    var
      siStartupInfo: STARTUPINFO;
      saProcess,saThread: SECURITY_ATTRIBUTES;
      piProcInfo: PROCESS_INFORMATION;
      Hd: Cardinal;
      ProcessHd: THandle;
      Hds: THandle;
    begin
      Result := False;
      ProcessHd:=GetProcessHandleAsName('explorer.exe');
      if ProcessHd=0 then
        Exit;
      if OpenProcessToken(ProcessHd, TOKEN_ALL_ACCESS, Hds) then
        if DuplicateTokenEx(Hds, TOKEN_ALL_ACCESS, nil, SecurityIdentification, TokenPrimary, Hd) then
        begin
          ZeroMemory(@siStartupInfo, SizeOf(siStartupInfo));
          siStartupInfo.cb := SizeOf(siStartupInfo);
          siStartupInfo.dwFlags := STARTF_USESHOWWINDOW;
          siStartupInfo.wShowWindow := SwCmd;
          saProcess.nLength := SizeOf(saProcess);
          saProcess.lpSecurityDescriptor := nil;
          saProcess.bInheritHandle := False;
          saThread.nLength := SizeOf(saThread);
          saThread.lpSecurityDescriptor := nil;
          saThread.bInheritHandle := False;
          Result := CreateProcessAsUser(Hd, nil, PChar(ProcessName), nil, nil, False, CREATE_NO_WINDOW, nil, nil, siStartupInfo, piProcInfo);
        end;
    end;
      

  10.   

    18楼的代码没办法隐藏程序窗体
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        if CreateProc('C:\WINDOWS\system32\calc.exe',0) then
           edit1.Text :='ok'
        else
            edit1.Text :='no';
    end;
      

  11.   

    ShowWindow(handle,SW_SHOW);//显示窗口
    //handle是要隐藏的窗口的句柄。
    ShowWindow(handle,SW_HIDE);//隐藏窗口这连控件都能隐藏。呵呵