获取父窗口的正确方法

时间:2013-06-01 11:19:33

标签: winapi

MSDN对GetParent函数说明如下:

  

获取父窗口而不是   所有者使用GetParent而不是GetAncestor   GA_PARENT旗帜。

但是当为没有父级的窗口调用GetAncestor(hWnd, GA_PARENT);时,它会返回桌面窗口,而GetParent会返回NULL

那么获得父母(而不是所有者)的正确方法是什么,如果没有,则获得NULL

当然我可以检查GetAncestor是否返回桌面窗口,但这对我来说似乎是个黑客攻击。

3 个答案:

答案 0 :(得分:6)

以下是我提出的建议:

//
// Returns the real parent window
// Same as GetParent(), but doesn't return the owner
//
HWND GetRealParent(HWND hWnd)
{
    HWND hParent;

    hParent = GetAncestor(hWnd, GA_PARENT);
    if(!hParent || hParent == GetDesktopWindow())
        return NULL;

    return hParent;
}

答案 1 :(得分:1)

考虑到最新的Win32文档在2020年进行了更新:

HWND GetRealParent(HWND hWnd)
{
    HWND hWndOwner;

    // To obtain a window's owner window, instead of using GetParent,
    // use GetWindow with the GW_OWNER flag.

    if (NULL != (hWndOwner = GetWindow(hWnd, GW_OWNER)))
        return hWndOwner;

    // Obtain the parent window and not the owner
    return GetAncestor(hWnd, GA_PARENT);
}

答案 2 :(得分:0)

一个稍微好一点的版本同时适用于"路线"如果它找不到合适的父节点,它将返回窗口本身(以避免空引用)。 使用GetParent而不是GetAncestor在我的情况下工作并返回我追求的窗口。

    public static IntPtr GetRealParent(IntPtr hWnd)
    {
        IntPtr hParent;

        hParent = GetAncestor(hWnd, GetAncestorFlags.GetParent);
        if (hParent.ToInt64() == 0 || hParent == GetDesktopWindow())
        { 
            hParent = GetParent(hWnd);
            if (hParent.ToInt64() == 0 || hParent == GetDesktopWindow())
            { 
                hParent = hWnd;
            }

        }

        return hParent;
    }