C# winform winApi 根據傳入handle 控制代碼獲取 其它視窗,如:使用中的子視窗、同級視窗等。
阿新 • • 發佈:2018-12-17
//根據傳入的視窗控制代碼,獲取到同級、頂級、低階的視窗,根據GetWindowCmd 傳入的不同獲取也不同,詳細看GetWindowCmd 類說明 [DllImport("user32.dll", SetLastError = true)] static extern IntPtr GetWindow(IntPtr hWnd, GetWindowCmd uCmd); private void SysCycleCheckNetTimer_Tick{ Form m_ActiveForm = null; //這句是我傳入的父視窗Handle 查詢能不能 獲取到 父視窗form物件 IntPtr winPtr = GetWindow(this.Handle, GetWindowCmd.GW_HWNDFIRST); m_ActiveForm = FromHandle(winPtr) as Form; //if (m_ActiveForm != null) //{ // MessageBox.Show("找到了"); //} //3、從父視窗獲取Handle迴圈取得所有子視窗 while (winPtr != IntPtr.Zero) { //4、繼續獲取下一個子視窗 winPtr = GetWindow(winPtr, GetWindowCmd.GW_HWNDNEXT); m_ActiveForm = FromHandle(winPtr) as Form; //排除沒用的視窗一個是父視窗另一個 m_ActiveForm.Name 為空的 不知道什麼視窗,所以根據空值來排除 剩餘的就是其他啟用中視窗 if (m_ActiveForm != null && this.Handle != winPtr&&!string.IsNullOrEmpty(m_ActiveForm.Name)) { MessageBox.Show("找到了111" + m_ActiveForm.Name); } } } public enum GetWindowCmd : uint { /// <summary> /// 返回的控制代碼標識了在Z序最高階的相同型別的視窗。 /// 如果指定視窗是最高階視窗,則該控制代碼標識了在Z序最高階的最高階視窗; /// 如果指定視窗是頂層視窗,則該控制代碼標識了在z序最高階的頂層視窗: /// 如果指定視窗是子視窗,則控制代碼標識了在Z序最高階的同屬視窗。 /// </summary> GW_HWNDFIRST = 0, /// <summary> /// 返回的控制代碼標識了在z序最低端的相同型別的視窗。 /// 如果指定視窗是最高階視窗,則該柄標識了在z序最低端的最高階視窗: /// 如果指定視窗是頂層視窗,則該控制代碼標識了在z序最低端的頂層視窗; /// 如果指定視窗是子視窗,則控制代碼標識了在Z序最低端的同屬視窗。 /// </summary> GW_HWNDLAST = 1, /// <summary> /// 返回的控制代碼標識了在Z序中指定視窗下的相同型別的視窗。 /// 如果指定視窗是最高階視窗,則該控制代碼標識了在指定視窗下的最高階視窗: /// 如果指定視窗是頂層視窗,則該控制代碼標識了在指定視窗下的頂層視窗; /// 如果指定視窗是子視窗,則控制代碼標識了在指定視窗下的同屬視窗。 /// </summary> GW_HWNDNEXT = 2, /// <summary> /// 返回的控制代碼標識了在Z序中指定視窗上的相同型別的視窗。 /// 如果指定視窗是最高階視窗,則該控制代碼標識了在指定視窗上的最高階視窗; /// 如果指定視窗是頂層視窗,則該控制代碼標識了在指定視窗上的頂層視窗; /// 如果指定視窗是子視窗,則控制代碼標識了在指定視窗上的同屬視窗。 /// </summary> GW_HWNDPREV = 3, /// <summary> /// 返回的控制代碼標識了指定視窗的所有者視窗(如果存在)。 /// GW_OWNER與GW_CHILD不是相對的引數,沒有父視窗的含義,如果想得到父視窗請使用GetParent()。 /// 例如:例如有時對話方塊的控制元件的GW_OWNER,是不存在的。 /// </summary> GW_OWNER = 4, /// <summary> /// 如果指定視窗是父視窗,則獲得的是在Tab序頂端的子視窗的控制代碼,否則為NULL。 /// 函式僅檢查指定父視窗的子視窗,不檢查繼承視窗。 /// </summary> GW_CHILD = 5, /// <summary> /// (WindowsNT 5.0)返回的控制代碼標識了屬於指定視窗的處於使能狀態彈出式視窗(檢索使用第一個由GW_HWNDNEXT 查詢到的滿足前述條件的視窗); /// 如果無使能視窗,則獲得的控制代碼與指定視窗相同。 /// </summary> GW_ENABLEDPOPUP = 6 } 這就是解決方法