2013-07-26 41 views
0

我嘗試從我的EXE調用另一個程序,我希望它在後臺靜靜地執行。 (由於此調用會發生非常頻繁,一個窗口彈出是不能接受的。)儘管有SW_HIDE和CREATE_NO_WINDOW,爲什麼通過CreateProcess調用的程序的窗口顯示?

做的

五月的方法是這樣的:

STARTUPINFO si; 
PROCESS_INFORMATION pi; 
ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
si.dwFlags = STARTF_USESHOWWINDOW; 
si.wShowWindow = SW_HIDE; 
ZeroMemory(&pi, sizeof(pi)); 
if (!CreateProcess(NULL, cl, NULL, NULL, FALSE, 
        CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) return -1; 
else 
{ 
    WaitForSingleObject(pi.hProcess, INFINITE); 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
    return 0; 
} 

的過程創建所需的程序運行,但不幸的是儘管有CREATE_NO_WINDOWSW_HIDE標誌,窗口仍會顯示。 我錯過了什麼/做錯了什麼?

我想通了,我也許可以去

  1. 得到進程句柄的進程ID通過GetProcessId
  2. 使用EnumWindowsGetWindowThreadProcessId找到匹配的窗口
  3. 使用獲得HWND撥打ShowWindowSW_HIDE

但這就是麻煩,我認爲SW_HIDE應該在創建過程中「開箱即用」,無論如何。

+0

我不不知道,但我想你告訴它被隱藏只會影響'WinMain'的第四個參數,程序可以使用或不使用它。 – chris

+0

因此,沒有辦法真正強迫程序隱藏? – Pixelchemist

+0

即使這樣說,我感覺很糟糕,但如果您是在不同的桌面上啓動它,則它在技術上可能會工作(在找到窗口時閃爍的時候沒有問題),具體取決於它的功能。 *有*是比這更乾淨的東西。 – chris

回答

6

您在wShowWindow字段中提供的值將傳遞到新啓動函數的入口點WinMain,但它只是建議 - 完全取決於是否顯示其窗口。

時顯示您的應用程序的主窗口是調用在這種情況下ShowWindow(hWnd, SW_SHOWNORMAL);SW_SHOWNORMAL標準/推薦行爲表示「使用任何值傳遞給WinMain」但同樣,它是由過程來它是否做到這一點。

一種方法,你可以得到你想要的是一個WH_CBT掛鉤(請參閱文檔SetWindowsHookEx)。這會讓你鉤住窗口創建並將其重新定位在屏幕外或停止顯示它。

+0

我忘了CBT鉤選項。輔助功能也可以工作,不需要注射。 – chris

+0

我不認爲CBT鉤子需要專門的注入,你只需要你的代碼在一個DLL中(即如果它確實需要注入,系統會爲你處理)。 –

+0

我會看看這個。非常感謝! – Pixelchemist

-3

否則方式隱祕發射使用的CreateProcess +/- HCBT的應用:窗口 - >僅郵件,窗口 - > WS_EX_LAYERED(阿爾法= 0),窗口 - > NULLREGION,STATRTUPINFO.lpDesktop ...

+0

我不知道這個答案試圖說什麼。 –

+0

你的問題:-( – kero

+0

真的嗎?你不想假定我可能不是一個完全白癡,並且改善你的答案以便更清楚嗎?你不會想到我可能不是唯一一個是否困惑? –

相關問題