2011-01-21 64 views
0
/* CreateProcess initialization */ 
STARTUPINFO si; 
PROCESS_INFORMATION pi; 

memset(&si, 0, sizeof(si)); 
memset(&pi, 0, sizeof(pi)); 
si.cb = sizeof(si); 

long ret; 
// si.wShowWindow = SW_HIDE; 
// hide process window.... // run in background.. 

si.dwFlags = STARTF_USESHOWWINDOW; 
si.wShowWindow = SW_HIDE; 

if (!CreateProcess(0, exe, 
     0, 0, 1, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi)) { 
    return; 
} 
//int prez = WaitForSingleObject(pi.hProcess, INFINITE); 

//CloseHandle(pi.hProcess); 

回答

0

新進程的創建者並不是你將新進程註冊到任務欄中。這是一個創建頂層窗口的新過程,用於決定是否在任務欄中。這個決定是基於該頂級窗口的擴展風格,這是由新進程決定的。

換句話說,爲了做到這一點,您必須在這個其他過程的頂層窗口中捅一下。

+0

WS_EX_APPWINDOW對於在任務欄中可見的窗口是不需要的,具有基本鑲邊(標題,邊框等)的可見頂層非工具欄窗口即使沒有該樣式也會獲得任務欄按鈕... – Anders 2011-01-21 14:45:31

+0

@Anders謝謝爲了澄清。我的答案的主要意義仍然正確,但是,你不說? – 2011-01-21 15:45:39

5

你可以嘗試設置你的STARTUPINFO結構STARTF_USESHOWWINDOWdwFlags部件和wShowWindow成員SW_HIDE

這將使CreateProcess()通0作爲WinMainnCmdShow參數。但是,並非所有的Windows應用程序都表現良好,並且在初始調用ShowWindow()時使用此值。

0

您可以找到與啓動的進程相關聯的窗口(請參閱FindWindowEnumWindows),並使用SW_HIDE調用ShowWindow函數。或者,您可以通過刪除WS_EX_APPWINDOW並添加WS_EX_TOOLWINDOW來修改窗口的擴展樣式。

最簡單的方法仍然是按照第一個答案中所述使用STARTUPINFO,如果啓動的進程遵守設置。