1. 程式人生 > >C# winform winApi 根據傳入handle 控制代碼獲取 其它視窗,如:使用中的子視窗、同級視窗等。

C# winform winApi 根據傳入handle 控制代碼獲取 其它視窗,如:使用中的子視窗、同級視窗等。

 
 
//根據傳入的視窗控制代碼,獲取到同級、頂級、低階的視窗,根據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
    }
 
 這就是解決方法