2010-07-16 79 views
7

這個「簡單」問題似乎充滿了側面問題。
例如。新過程是否打開多個窗口;它有一個啓動畫面嗎?
有沒有簡單的方法? (我開始記事本的新實例++)如何獲得由ShellExecuteEx打開的窗口的hWnd .. hProcess?

... 
std::tstring tstrNotepad_exe = tstrProgramFiles + _T("\\Notepad++\\notepad++.exe"); 

SHELLEXECUTEINFO SEI={0}; 
sei.cbSize  = sizeof(SHELLEXECUTEINFO); 
sei.fMask  = SEE_MASK_NOCLOSEPROCESS; 
sei.hwnd   = hWndMe; // This app's window handle 
sei.lpVerb  = _T("open"); 
sei.lpFile  = tstrNotepad_exe.c_str();  
sei.lpParameters = _T(" -multiInst -noPlugins -nosession -notabbar "; 
sei.lpDirectory = NULL; 
sei.nShow  = SW_SHOW; 
sei.hInstApp  = NULL;  
if(ShellExecuteEx(&sei)) 
{ // I have sei.hProcess, but how best to utilize it from here? 
} 
... 

回答

12

首先使用WaitForInputIdle直到應用程序已經開始暫停程序,並等待用戶輸入(主窗口應該已經通過再創造),然後使用EnumWindowsGetWindowThreadProcessId來確定系統中哪些窗口屬於創建的進程。

例如:

struct ProcessWindowsInfo 
{ 
    DWORD ProcessID; 
    std::vector<HWND> Windows; 

    ProcessWindowsInfo(DWORD const AProcessID) 
     : ProcessID(AProcessID) 
    { 
    } 
}; 

BOOL __stdcall EnumProcessWindowsProc(HWND hwnd, LPARAM lParam) 
{ 
    ProcessWindowsInfo *Info = reinterpret_cast<ProcessWindowsInfo*>(lParam); 
    DWORD WindowProcessID; 

    GetWindowThreadProcessId(hwnd, &WindowProcessID); 

    if(WindowProcessID == Info->ProcessID) 
     Info->Windows.push_back(hwnd); 

    return true; 
} 

.... 

if(ShellExecuteEx(&sei)) 
{ 
    WaitForInputIdle(sei.hProcess, INFINITE); 

    ProcessWindowsInfo Info(GetProcessId(sei.hProcess)); 

    EnumWindows((WNDENUMPROC)EnumProcessWindowsProc, 
     reinterpret_cast<LPARAM>(&Info)); 

    // Use Info.Windows..... 
} 
+0

感謝喬恩......這麼短的時間間隔輪詢是去......這是有道理的:) – 2010-07-16 23:34:06

+0

我通過你的榜樣,現在的工作...... 和方式PS到我以前的評論:我只是在MSDN中注意到:WaitForInputIdle可以隨時使用,而不僅僅是在應用程序啓動過程中。 但是,WaitForInputIdle只等待進程變空閒一次;後續的WaitForInputIdle調用立即返回,無論進程是空閒還是繁忙。 *似乎民意測驗不是一個好主意......我會做一些測試。 – 2010-07-16 23:57:40

+0

創建進程時,您只需要使用WaitForInputIdle。從此,只需輪詢EnumWindows調用即可獲取更新的窗口列表。 – 2010-07-17 00:40:30

相關問題