2010-07-26 96 views
0

在我的應用程序中我有計時器,在TimerProc中我想獲得具有焦點的另一個應用程序的所有窗口(主和子)的句柄。我不知道如何做到這一點,因爲我不明白像GetNextWindow或GetParent和窗口的Z-oder功能,我無法找到任何地方非常詳細的解釋如何這個功能的工作原理(我不明白解釋上msdn)。請你能給我一些建議或代碼塊這樣做嗎?非常感謝您的回答。如何獲取另一個應用程序的所有窗口的句柄

回答

2

使用GetForegroundWindow()函數 - 它返回用戶當前正在處理的窗口的HWND。 然後有這個處理可以以這樣的方式找回孩子的:

HWND a_hWnd = (HWND)hParent; 
    HWND a_FirstChild = NULL; 
    a_FirstChild = ::GetWindow(a_hWnd, GW_CHILD); 

    if (a_FirstChild != NULL) 
    { 

    HWND a_NextChild = NULL; 
    do 
    { 
     a_NextChild = ::GetWindow(a_FirstChild, GW_HWNDNEXT); 
     if (a_NextChild != NULL) 
     { 
     a_FirstChild = a_NextChild; 
     } 
    } 
    while (a_NextChild != NULL); 
} 
+0

喜感謝的答案,但它返回主窗口或子窗口中的一個?如果它是主窗口,我怎樣才能遍歷所有的子窗口? – sanjuro 2010-07-26 14:55:18

+0

HWND hParent = GetForegroundWindow(); //主窗口 :: GetWindow(a_FirstChild,GW_HWNDNEXT); //循環childs – southerton 2010-07-26 14:59:05

+0

或者,您可以使用EnumChildWindows函數。 – southerton 2010-07-26 15:01:31

1

GetForeGroundWindow得到當前前臺窗口/對話框
的getParent,直到你得到NULL(即讓你的頂層窗口)**
EnumChildWindows獲得所有相關的窗口

**注意,應用程序可以有不止一個頂層窗口,雖然這是不常見。

代碼:

void Ccpp_testDlg::DoWalk() 
{ 
    HWND hCurrent; 
    HWND hNew; 

    hCurrent = ::GetForegroundWindow(); 
    hNew  = hCurrent; 

    while (hNew != NULL) 
    { 
     hNew = ::GetParent (hCurrent); 
     if (hNew != NULL) 
     { 
     hCurrent = hNew; 
     } 
    } 
    EnumChildWindows (hCurrent, EnumProc, 0); 
} 

BOOL CALLBACK EnumProc (HWND hwnd,LPARAM lParam) 
{ 
    TCHAR szText [MAX_PATH]; 
    GetWindowText (hwnd, szText, sizeof(szText)); 
    // do something with text 
    return TRUE; 
} 
相關問題