新process的啟動,可以通過system(const char*)函數啟動另外一個程序,但是有一個小問題,就是每次執行system函數的時候,都會彈出dos窗口(命令行嘛~~~),有沒有什么方法能夠讓我調用的程序在后台執行呢?
好像無法隱藏system函數的窗口,只能最小化等參數,不過有另外一種選擇開啟另外一個進程。
其方法主要有以下幾種:
1. WinExec(LPCSTR, UInt)函數
其第一個參數相當於system函數的參數,第二個參數可以設置窗口是否顯示,SW_HIDE這個宏表示隱藏窗口,例如:
WinExec(cmd.c_str(),SW_HIDE);//cmd(string類型)中為我們要調用的程序名及其參數, 如 “dir *.exe ”
但是這個有一個問題,這個函數創建完這個進程后就返回了,也就是說它返回后,該進程不一定已經結束,這個就有點和system不一樣了,在這里我無法使用這個函數了~~~
2.ShellExecuteEx(SHELLEXECUTEINFO*)函數
其參數是一個結構體,具體作用還是類似於system的參數,使用例子:
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
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);
但是這個還是有問題,同1中一樣,無法確定該進程是否結束~~~
3.CreateProcess函數,這個的用法可以去百度一下~~~
然后,有沒有辦法使得主程序在其啟動的子程序結束之前一直保持暫停狀態,可以使用
WaitForSingleObject(HANDLE,DWORD)函數
例子:
在2的代碼下加一行:WaitForSingleObject(ShExecInfo.hProcess,INFINITE);////等到該進程結束
完全可以把上述代碼片段封裝成一個小的函數,來代替system函數
void mySystem(const string& cmd, const string& par, int nShow)
{
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
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);////等到該進程結束
}
那么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 激活並顯示窗口。若窗口是最小化或最大化,則恢復到原來的大小和位置。在還原應用程序的最小化窗口時,應指定該標志。
http://blog.csdn.net/flyingleo1981/article/details/72621168