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
    {
        /// 
        /// 返回的句柄标识了在Z序最高端的相同类型的窗口。
        /// 如果指定窗口是最高端窗口,则该句柄标识了在Z序最高端的最高端窗口;
        /// 如果指定窗口是顶层窗口,则该句柄标识了在z序最高端的顶层窗口:
        /// 如果指定窗口是子窗口,则句柄标识了在Z序最高端的同属窗口。
        /// 
        GW_HWNDFIRST = 0,
        /// 
        /// 返回的句柄标识了在z序最低端的相同类型的窗口。
        /// 如果指定窗口是最高端窗口,则该柄标识了在z序最低端的最高端窗口:
        /// 如果指定窗口是顶层窗口,则该句柄标识了在z序最低端的顶层窗口;
        /// 如果指定窗口是子窗口,则句柄标识了在Z序最低端的同属窗口。
        /// 
        GW_HWNDLAST = 1,
        /// 
        /// 返回的句柄标识了在Z序中指定窗口下的相同类型的窗口。
        /// 如果指定窗口是最高端窗口,则该句柄标识了在指定窗口下的最高端窗口:
        /// 如果指定窗口是顶层窗口,则该句柄标识了在指定窗口下的顶层窗口;
        /// 如果指定窗口是子窗口,则句柄标识了在指定窗口下的同属窗口。
        /// 
        GW_HWNDNEXT = 2,
        /// 
        /// 返回的句柄标识了在Z序中指定窗口上的相同类型的窗口。
        /// 如果指定窗口是最高端窗口,则该句柄标识了在指定窗口上的最高端窗口;
        /// 如果指定窗口是顶层窗口,则该句柄标识了在指定窗口上的顶层窗口;
        /// 如果指定窗口是子窗口,则句柄标识了在指定窗口上的同属窗口。
        /// 
        GW_HWNDPREV = 3,
        /// 
        /// 返回的句柄标识了指定窗口的所有者窗口(如果存在)。
        /// GW_OWNER与GW_CHILD不是相对的参数,没有父窗口的含义,如果想得到父窗口请使用GetParent()。
        /// 例如:例如有时对话框的控件的GW_OWNER,是不存在的。
        /// 
        GW_OWNER = 4,
        /// 
        /// 如果指定窗口是父窗口,则获得的是在Tab序顶端的子窗口的句柄,否则为NULL。
        /// 函数仅检查指定父窗口的子窗口,不检查继承窗口。
        /// 
        GW_CHILD = 5,
        /// 
        /// (WindowsNT 5.0)返回的句柄标识了属于指定窗口的处于使能状态弹出式窗口(检索使用第一个由GW_HWNDNEXT 查找到的满足前述条件的窗口);
        /// 如果无使能窗口,则获得的句柄与指定窗口相同。
        /// 
        GW_ENABLEDPOPUP = 6
    }
 
 这就是解决方法

 

你可能感兴趣的:(C#,Winfrom)