11

MSDN 关于该GetParent功能的说明如下:

要获得父窗口而不是所有者,而不是使用GetParent,使用GetAncestor标志 GA_PARENT

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

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

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

4

3 回答 3

10

这是我想出的:

//
// 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;
}
于 2013-06-01T16:04:03.993 回答
4

考虑到最新的 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);
}
于 2020-06-26T11:42:24.607 回答
1

一个稍微好一点的版本,它同时走“路线”,如果找不到合适的父级,它将返回窗口本身(以避免空引用)。使用 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;
    }
于 2015-08-22T00:46:11.740 回答