【问题标题】:C# - Win32: Getting a handle to the topmost window, after it has lost focus?C# - Win32:在失去焦点后获取最顶层窗口的句柄?
【发布时间】:2009-03-11 09:17:27
【问题描述】:

试图从我的 WPF 应用程序(它只是通过系统托盘运行)挖掘 win32 api。

当单击系统托盘图标时,我会向用户显示一个上下文菜单,该菜单可以将焦点放在最顶部的任何窗口上。

我想获得那个窗口(刚刚失去焦点的那个窗口)的句柄,并尝试了使用不同的方法

GetForeGroundWindow()
GetTopWindow()
GetDesktopWindow()

然而,没有尽头。我目前正在考虑遍历所有进程,以获取 MainWindowHandles 并检查每个窗口的 z 顺序。

但我认为有一种更简单/更智能的方法;只是一本我无法通过谷歌搜索或从我的旧 Petzold 著作中回忆的内容。

另一种方法是让我的系统托盘菜单在激活时获得焦点?

谢谢!

【问题讨论】:

    标签: winapi z-index


    【解决方案1】:

    您可以在打开菜单之前获得最顶层的窗口,而不管用户最终会选择哪个菜单项。

    然后,如果您需要最顶层的窗口,您可以使用在打开菜单之前获得的值。

    【讨论】:

    • 当然!试图找到要覆盖的焦点事件,但目前只是使用 DispatcherTimer 进行检查。
    【解决方案2】:

    我认为没有什么比您描述的 z-index 迭代更简单的了。您的系统托盘菜单必须获得焦点,否则人们将无法使用它(例如,使用键盘)。如果它获得焦点,则它成为前景窗口,因此旧的前景窗口与系统中的任何其他非活动窗口没有任何区别。真的,z-index 检查恕我直言是唯一的方法。

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多