2009-07-17 97 views
3

我正在使用CreateProcess()將啓動標誌設置爲STARTF_USESHOWWINDOW和SW_HIDE以在隱藏窗口的背景中啓動應用程序。 我這樣做是爲了運行一個計劃的維護任務,我不想被打擾與Windows。創建隱藏進程(窗口不可見)

在大多數情況下,窗口是隱藏的,但有些情況下,程序的窗口會在您的面前彈出(例如Google的Chrome瀏覽器 - 我開始使用不同的應用程序進行測試,以查看這是否是曾經的問題,但不是。 ..)。

在Windows XP中這種情況較少,但在Vista上會發生很多。

有沒有我失蹤的標誌?有沒有其他的方式來創建一個窗口隱藏的過程?

謝謝!

我的樣本代碼:

char *ProgramName 
STARTUPINFO StartupInfoF; 
PROCESS_INFORMATION ProcessInfoF; 

memset(&StartupInfoF, 0, sizeof(StartupInfoF)); 
memset(&ProcessInfoF, 0, sizeof(ProcessInfoF)); 

StartupInfoF.cb = sizeof(StartupInfoF); 
StartupInfoF.wShowWindow = SW_HIDE; 
StartupInfoF.dwFlags = STARTF_USESHOWWINDOW;  

if (CreateProcess(ProgramName, 
        "",     
        0, 
        0, 
        FALSE, 
        DETACHED_PROCESS, 
        0, 
        0,        
        &StartupInfoF, 
        &ProcessInfoF) == FALSE) 
{ 
    // error 
} 
else 
{ 
    // OK 
} 

回答

4

您可以使用傳遞給CreateProcess的STARTUPINFO結構的lpDesktop成員在另一個桌面上啓動進程。這樣,該過程將顯示所有窗口,但在另一臺桌面上,因此您(或您的用戶)不會因此而煩惱。

我從來沒有與多個桌面工作,所以我不能說什麼是副作用,但我認爲這是可行的。首先查看CreateDesktop並繼續前進。

+0

好吧,這似乎工作,但是我得到一個錯誤,並在搜索MSDN後說,我不需要有DESKTOP_CREATEWINDOW權限。你知道如何改變我的流程權限並添加DESKTOP_CREATEWINDOW嗎? – wonderer 2009-07-17 14:30:54

0

某些程序可能忽略/覆蓋SW_HIDE標誌。子進程啓動後,您可以嘗試隱藏窗口。

另一種方法是嘗試使用CreateProcessAsUser運行隔離桌面(從Vista版本開始)的會話0中的進程。

+0

但這會讓我眼前的窗戶閃爍。非常討厭... – wonderer 2009-07-17 13:22:55

0

我不記得你的問題的答案,但我想建議,也許你不應該保持窗口完全隱藏?如果你想讓窗戶擺脫困境,最小化它就足夠了;完全隱藏它只會消除檢查計劃維護任務的能力。

0

我建議讓它成爲一項服務。首先,即使在沒有人登錄的情況下,也可以運行預定的維護。另一方面,設置服務非常容易,以至於無法訪問桌面。