C#查找顶级窗口

时间:2014-01-25 16:03:15

标签: c# windows pinvoke

如果我有孩子的手柄,如何找到顶级窗口?

修改
例如,我正试图在WindowsMediaPlayer12中处理播放按钮 我以为我可以使用GetForegroundWindow()获取窗口(WMP窗口)的主要句柄,然后在其子节点中找到播放按钮...在大多数情况下GetForegroundWindow()工作,我得到整个焦点窗口的句柄,但有时(并在此case)它只返回窗口当前聚焦的孩子的句柄 因此,在这种情况下,GetForegroundWindow()返回玩家上半部分的句柄,而播放按钮不是其中一个孩子。我想知道如何处理整个玩家?

EDIT2:
示例2:打开Opera浏览器并单击地址栏。调用GetForegroundWindow()。您将只处理Opera窗口的那一部分而不是显示的整个Opera窗口。尝试列出该句柄的子项。没有孩子 (粗体是我正在寻找的句柄。)

3 个答案:

答案 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应该是该进程的最顶层窗口。从那里你可以穿过孩子找到你想要的孩子。