exe、msi、dos、bat等靜默運行,後臺運行,不彈窗的解決辦法

一、exe程序自己不想顯示,

        在源碼開頭中加入   #pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )redis

 

二、打開其餘的exe

         2.1使用WinExec(LPCSTR, UInt)函數

            其第一個參數至關於system函數的參數,第二個參數能夠設置窗口是否顯示,SW_HIDE這個宏表示隱藏窗口,例如:shell

            WinExec(cmd.c_str(),SW_HIDE);//cmd(string類型)中爲咱們要調用的程序名及其參數, 如 「dir *.exe 」windows

            可是這個有一個問題,這個函數建立完這個進程後就返回了,也就是說它返回後,該進程不必定已經結束函數

            另外,第一個參數不能有空格ui

            

 

 

           

  2.2 使用ShellExecute函數

            ShellExecute(NULL,"open","calc.exe","","", SW_HIDE);spa

          

         

       2.3 使用ShellExecuteEx函數

       ShellExecuteEx(SHELLEXECUTEINFO*)函數命令行

        其參數是一個結構體,具體做用仍是相似於system的參數,使用例子:code

SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;   //確保返回hProcess用於瞭解打開的東西的生命週期
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = cmd.c_str();//調用的程序名
ShExecInfo.lpParameters = par.c_str();//調用程序的命令行參數
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_HIDE;//窗口狀態爲隱藏
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);//等到該進程結束 ,固然能夠不等待。。blog

CloseHandle(ShExecInfo.hProcess) ;  //釋放資源排序

3.CreateProcess函數

 

STARTUPINFO si; PROCESS_INFORMATION pi; LPTSTR szCmdline = _tcsdup(TEXT("MyChildProcess")); ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; ZeroMemory(&pi, sizeof(pi)); // Start the child process.

if (!CreateProcess(NULL,   // No module name (use command line)
    szCmdline,      // Command line
    NULL,           // Process handle not inheritable
    NULL,           // Thread handle not inheritable
    FALSE,          // Set handle inheritance to FALSE
    CREATE_NO_WINDOW, // No Console window
    NULL,           // Use parent's environment block
    NULL,           // Use parent's starting directory
    &si,            // Pointer to STARTUPINFO structure
    &pi)           // Pointer to PROCESS_INFORMATION structure
 ) { printf("CreateProcess failed (%d)./n", GetLastError()); return; } // Wait until child process exits.
WaitForSingleObject(pi.hProcess, INFINITE); // Close process and thread handles.
CloseHandle(pi.hProcess); CloseHandle(pi.hThread);

 

    三、打開msi文件(隱藏安裝過程)

            能夠經過bat文件,輸入

            xxx.msi  /qn   

            q意思是quiet,n意思是沒有用戶交互

            若是經過shell打開的話,注意msi只是個安裝文件,安裝程序爲msiexec.exe

            system("msiexec.exe /i \"E:\\vcredist_x86\\vcredist.msi\" /qn");  (這個會彈一個控制檯的框system自己)

           下面的方法能夠啥都不彈。

SHELLEXECUTEINFO ShExecInfo = { 0 }; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = NULL; ShExecInfo.lpFile = L"Msiexec.exe";//調用的程序名
    ShExecInfo.lpParameters = L"/i \"E:\\vcredist_x86\\vcredist.msi\" /qn";//調用程序的命令行參數
    ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_HIDE;//窗口狀態爲隱藏
    ShExecInfo.hInstApp = NULL; if (!ShellExecuteEx(&ShExecInfo)) { printf("%d", GetLastError()); } WaitForSingleObject(ShExecInfo.hProcess,30000); CloseHandle(ShExecInfo.hProcess);

 

                      

 

     四、bat文件

            bat文件運行時會有一個黑黑的cmd.exe窗口,很嚇人,就算用start/min命令去運行bat文件,電腦的任務欄下仍然會有相關的圖標,怎麼讓bat文件在後臺無聲無息無影無形地運行呢?如下的辦法能夠達到你的目的。

           方法1、

              bat裏有隱藏窗口的命令,很簡單,只須要在代碼頭部加一段代碼就能夠了。

@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit
:begin
::下面是你本身的代碼。

            方法2、

     在你批處理的相同目錄下新建一個記事本,裏面輸入:

DIM objShell set objShell=wscript.createObject("wscript.shell")
iReturn=objShell.Run("cmd.exe /C c:\1.bat", 0, TRUE)   
    (其中win.bat爲你本身的批處理名字,本身改)   

      而後把這個記事本保存爲後綴名爲.vbe的文件,到時候你只要運行這個vbe文件就達到目的了!   

      能夠寫的簡單點:

Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c c:\1.bat",0
    或

CreateObject("WScript.Shell").Run "cmd /c c:\1.bat",0
      (這種寫法不少殺軟報毒, 須要替換參數0)   

      最後那個0是指窗口參數,用法爲:

      0 隱藏窗口並激活另外一窗口。   

     1 激活並顯示一個窗口。若窗口是最小化或最大化,則恢復到其原來的大小和位置。   

     2 激活窗口並以最小化顯示該窗口。   

     3 激活窗口並以最大化顯示該窗口。   

     4 按窗口最近的大小和位置顯示。活動窗口保持活動。   

     5 以當前大小和位置激活並顯示窗口。   

     6 最小化指定窗口並激活按 Z 序排序的下一個頂層窗口。   

     7 最小化顯示窗口。活動窗口保持活動。   

     8 以當前狀態顯示窗口。活動窗口保持活動。   

    9 激活並顯示窗口。若窗口是最小化或最大化,則恢復到原來的大小和位置。在還原應用程序的最小化窗口時,應指定該標誌。

相關文章
相關標籤/搜索