如果我有孩子的手柄,如何找到顶级窗口?
修改
例如,我正试图在WindowsMediaPlayer12中处理播放按钮
我以为我可以使用GetForegroundWindow()获取窗口(WMP窗口)的主要句柄,然后在其子节点中找到播放按钮...在大多数情况下GetForegroundWindow()工作,我得到整个焦点窗口的句柄,但有时(并在此case)它只返回窗口当前聚焦的孩子的句柄
因此,在这种情况下,GetForegroundWindow()返回玩家上半部分的句柄,而播放按钮不是其中一个孩子。我想知道如何处理整个玩家?
EDIT2:
示例2:打开Opera浏览器并单击地址栏。调用GetForegroundWindow()。您将只处理Opera窗口的那一部分而不是显示的整个Opera窗口。尝试列出该句柄的子项。没有孩子
(粗体是我正在寻找的句柄。)
答案 0 :(得分:0)
您是否尝试过使用WindowInteropHelper类?
IntPtr windowHandle = new WindowInteropHelper(myWindow).Owner;
IntPtr windowHandle = new WindowInteropHelper(myWindow).Handle;
编辑:
现在你的问题已被编辑,我认为你的解决方案可以是从主窗口向下跳转,而不是从聚焦控制向上跳过..尝试:
Window mainWindow = Application.Current.MainWindow
答案 1 :(得分:0)
继续致电GetParent
,直至返回NULL
。
答案 2 :(得分:0)
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
public enum GetAncestorFlags
{
GetParent = 1,
GetRoot = 2,
GetRootOwner = 3
}
[DllImport("user32.dll")]
public static extern IntPtr GetAncestor(IntPtr hwnd, GetAncestorFlags gaFlags);
IntPtr wHandle = GetForgroudWindow();
IntPtr rootHandle = GetAncestor(wHandle, GetAncestorFlags.GetRoot);
rootHandle应该是该进程的最顶层窗口。从那里你可以穿过孩子找到你想要的孩子。