2013-06-30 81 views
0

基本上,我想將進程ID轉換爲HWND。我使用此代碼:將PID轉換爲HWND

DWORD dwWindowId; 
    CHAR  pszClassName[200]; 
    HWND  hWnd; 

    hWnd = GetTopWindow (NULL); 

    while (hWnd != NULL) 
    { 
     if (GetClassName (hWnd, pszClassName, 200) > 0) 
     if (lstrcmpiA (lpcszWindowClass, pszClassName) == 0) 
      if (GetWindowThreadProcessId (hWnd, &dwWindowId)) 
       if (dwWindowId == dwProcessId) 
        return hWnd; 

     hWnd = GetNextWindow (hWnd, GW_HWNDNEXT); 
    } 
    return NULL; 

這工作得很好,直到我試圖用一個進程被CreateProcess創建。在這種情況下我該怎麼辦?我有流程信息,例如CreateProcess的ID和線程ID,但我仍然不知道如何獲取它的hwnd。我看過這樣的:

你叫CreateProcess()後,檢查PROCESS_INFORMATION 結構由lpProcessInformation參數指向。 PROCESS_INFORMATION包含一個處理程序,你只需要 開始和一個線程ID。通過此信息調用 GetGUIThreadInfo()函數,然後檢查由lpgui指向的結構體。 GUITHREADINFO有幾個HWND。使用hwndActive啓動 ,並致電GetParent()GetAncestor()直至找到主窗口 。

通過bug_crusher

我試圖EnumChildWindows()EnumWindows(),他們沒有工作。

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) 
{ 
    DWORD PID =0; 
    GetWindowThreadProcessId(hwnd,&PID); 
    if(PID == 1) 
    { 
     //,,,,,,,, 
    } 
    return TRUE; 
} 

但我不明白,任何人都可以解釋嗎?

+2

進程可以沒有,一個或多個窗口,沒有「進程的hwnd」這樣的事情。 'EnumWindows'併爲每一個調用'GetWindowThreadProcessId'。 –

+0

它不起作用,即使使用EnumWindows() –

+0

什麼是行不通的?您需要更具體地瞭解您嘗試的內容,您期望得到的結果以及您觀察到的結果。 –

回答

2

我對你實際嘗試做什麼感到有點困惑,但是這個函數將構建屬於指定進程的所有頂級窗口的向量。

void GetWindowsOfProcess(DWORD dwId, std::vector<HWND>& vecWindows) 
{ 
    struct WindowsOfProcess 
    { 
     std::vector<HWND>* pvecWindows; 
     DWORD    dwProcId; 

     static BOOL CALLBACK EnumProc(HWND hWnd, LPARAM lParam) 
     { 
      DWORD dwProcId; 
      GetWindowThreadProcessId(hWnd, &dwProcId); 
      if (dwProcId == reinterpret_cast<WindowsOfProcess*>(lParam)->dwProcId) 
       reinterpret_cast<WindowsOfProcess*>(lParam)->pvecWindows->push_back(hWnd); 
      return TRUE; 
     } 

     WindowsOfProcess(DWORD dwId, std::vector<HWND>* pvec) 
      : dwProcId(dwId) 
      , pvecWindows(pvec) 
     { 
      EnumWindows(EnumProc, reinterpret_cast<LPARAM>(this)); 
     } 
    }; 
    WindowsOfProcess wop(dwId, &vecWindows); 
} 
+0

謝謝代碼的PID,但我想我找到了一種方法,除非我有2個應用程序具有相同的名稱test.exe和我使用finiwindow,我怎麼能找到第二個text.exe?那可能嗎? –