之前開發的某個自用的小程式程式,需要在程式裡面執行另外一支外部程式我很直覺的想到了system(),這function的確也很盡職的達到呼叫的目的,但是缺點是他會帶出一個黑黑醜醜的console window,畫面上實在非常不美觀,為了隱藏這個醜陋的視窗,我決定想盡辦法把那該死的console window給隱藏起來,結果因為我跟windows api的不熟,花了我不少功夫,所以特地紀錄一下。
隱藏方法就是使用ShellExecuteEx() + WaitForSingleObject() 就可以完美的達成目標, 詳細用法如下:
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c:\\xxx\\xxx.exe"; // 外部呼叫的檔案路徑及名稱
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_HIDE; // SW_HIDE就是把window給hide起
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo); // 執行吧!!
//為了確定該支console程式完整執行完才繼續往下, 使用WaitForSingleObject
//去等待剛剛那個process, 等待timeout時間設為INFINITE (永久)
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);

通告: waitforsingleobject