MSDN对GetParent
函数说明如下:
获取父窗口而不是 所有者使用
GetParent
而不是GetAncestor
GA_PARENT
旗帜。
但是当为没有父级的窗口调用GetAncestor(hWnd, GA_PARENT);
时,它会返回桌面窗口,而GetParent
会返回NULL
。
那么获得父母(而不是所有者)的正确方法是什么,如果没有,则获得NULL
?
当然我可以检查GetAncestor
是否返回桌面窗口,但这对我来说似乎是个黑客攻击。
答案 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;
}