如何隐藏system函数的窗口
生活随笔
收集整理的這篇文章主要介紹了
如何隐藏system函数的窗口
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如何隱藏system函數的窗口
修改瀏覽權限 | 刪除 由于一直在寫控制臺的程序,對于MFC并不是很熟。這次寫osg<——>ive格式轉換器這個小工具的時候,涉及到使用setlocale函數來設置本地資源,不知道為什么在MFC中無法生效,于是只好寫了一個帶命令行參數的控制臺程序,希望通過MFC這個界面傳遞參數來使用這個控制臺程序。
???
??? 最先想到的是system函數,因為可以通過system(const char*)函數啟動另外一個程序,其實這么解決已經很好了,但是有一個小問題,就是每次執行system函數的時候,都會彈出dos窗口(命令行嘛~~~),有沒有什么方法能夠讓我調用的程序在后臺執行呢?
??? 百度之后,發現好像無法隱藏system函數的窗口,不過有另外一種選擇,就是在MFC界面中開啟另外一個進程,其方法主要有三:
??? 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);等到該進程結束
??? } 為了您的安全,請只打開來源可靠的網址
???
??? 最先想到的是system函數,因為可以通過system(const char*)函數啟動另外一個程序,其實這么解決已經很好了,但是有一個小問題,就是每次執行system函數的時候,都會彈出dos窗口(命令行嘛~~~),有沒有什么方法能夠讓我調用的程序在后臺執行呢?
??? 百度之后,發現好像無法隱藏system函數的窗口,不過有另外一種選擇,就是在MFC界面中開啟另外一個進程,其方法主要有三:
??? 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);等到該進程結束
??? } 為了您的安全,請只打開來源可靠的網址
打開網站????取消
來自: http://hi.baidu.com/simbaforrest/blog/item/a41badfa2dea309158ee90b1.html http://apps.hi.baidu.com/share/detail/14007488總結
以上是生活随笔為你收集整理的如何隐藏system函数的窗口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: system函数用法
- 下一篇: 转一个,中文分词方法概述