Windows中煩人的彈窗

衆所周知,在Windows下要想執行某個命令,必須打開Windows那個黑乎乎的DOS彈窗。那麼當我們編寫bat文件,或者在程序中編寫程序需要程序執行某個終端命令時,不想讓這個黑乎乎的彈窗彈出來要怎麼辦呢,接下來記錄一下我這兩天的新得:
(1)執行bat文件避免彈窗
網上說的一大堆方法試了一下,還是這個比較靠譜:
建立一個vbe或者vbs文件(兩個文件本是同根生,前者可以加密,後者不可以加密),然後在這個文件中添加以下代碼:

Set ws = createObject("WScript.shell")
ws.run "cmd /c xxx.bat",vbhide

這個xxx.bat就是你想要執行的.bat文件,只需要將你的.bat
文件和你的.vbe文件放在同一個目錄下,然後執行.vbe文件,就可以讓你的xxx.bat文件無彈窗式地執行了。
(2)在程序代碼中需要執行終端命令且避免彈窗
首先我們在程序代碼中添加執行終端命令的代碼一般會想到調用system()函數,這個函數在linux和windows下都是這個名字,而且用法也相似,但是在Windows下的程序中調用這個函數會出現彈窗,怎麼樣避免這個彈窗呢,如果非要用system這個函數的話,暫時沒有找到好的解決辦法,所以我選擇用其他的函數代替這個system函數,就取名爲MySystem吧。函數原型如下:

  void CMainFrame::MySystem( CString cmd, CString par, DWORD nShow)
{
    SHELLEXECUTEINFO ShExecInfo = { 0 };
    ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    ShExecInfo.hwnd = NULL;
    ShExecInfo.lpVerb = NULL;
    ShExecInfo.lpFile = cmd;//executable file
    ShExecInfo.lpParameters = par;//parameter
    ShExecInfo.lpDirectory = NULL;
    ShExecInfo.nShow = nShow;//set window status
    ShExecInfo.hInstApp = NULL;
    ShellExecuteEx(&ShExecInfo); //start a new process
    WaitForSingleObject(ShExecInfo.hProcess, INFINITE);//wait for the process to end
}

我這裏不關心他的返回值,所以直接返回void,如果需要返回值的話請參考博客:https://blog.csdn.net/mpp_king/article/details/80194563
調用方法:
MySystem( L"cmd.exe",L"/c your command", SW_HIDE);
之所以要加/c,是因爲ShellExecuteEx執行cmd命令的時候, 命令行參數要加入/c 來讓命令行執行完成後關閉自身。否則命令行進程會一直存在, WaitForSingleObject會一直等待,也是通過上述的博客得知

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章