C# - Win32:在失去焦点后获取最顶层窗口的句柄?

时间:2009-03-11 09:17:28

标签: winapi z-index

尝试从我的WPF应用程序(仅通过系统托盘运行)深入研究win32 api。

当点击系统托盘图标时,我会向用户显示一个上下文菜单,该窗口会在最顶层的窗口上获得焦点。

我希望得到一个窗口的句柄(那个刚刚失去焦点的窗口)并尝试使用不同的方法

GetForeGroundWindow()
GetTopWindow()
GetDesktopWindow()

然而,永无止境。我正在考虑迭代所有进程,获取MainWindowHandles并检查每个窗口的z顺序。

但我估计有一种更简单/更聪明的方式;只是一个我不能谷歌或从我的旧Petzold书中回忆。

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

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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