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


1、exe程序本身不想顯示,

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

 

2、打開其他的exe

         2.1使用WinExec(LPCSTR, UInt)函數

            其第一個參數相當於system函數的參數,第二個參數可以設置窗口是否顯示,SW_HIDE這個宏表示隱藏窗口,例如:

            WinExec(cmd.c_str(),SW_HIDE);//cmd(string類型)中為我們要調用的程序名及其參數, 如 “dir *.exe ”

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

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

            

 

 

           

  2.2 使用ShellExecute函數

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

          

         

       2.3 使用ShellExecuteEx函數

       ShellExecuteEx(SHELLEXECUTEINFO*)函數

        其參數是一個結構體,具體作用還是類似於system的參數,使用例子:

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);//等到該進程結束 ,當然可以不等待。。

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);

 

    3、打開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);

 

                      

 

     4、bat文件

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

           方法一、

              bat里有隱藏窗口的命令,很簡單,只需要在代碼頭部加一段代碼就可以了。

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

            方法二、

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

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 激活並顯示窗口。若窗口是最小化或最大化,則恢復到原來的大小和位置。在還原應用程序的最小化窗口時,應指定該標志。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM