关于.net:将窗口焦点恢复到以前的所有者

Restoring window focus back to previous owner

我在系统托盘中有一个应用程序,双击它会打开一个窗口,相当标准;但是,当您关闭窗口时,我希望在打开我的窗口之前获得焦点的窗口重新获得焦点。

如果我通过键盘快捷键弹出我的窗口,我可以在我的窗口显示之前使用 GetForegroundWindow API 调用来恢复之前关闭的焦点,然后在我的窗口关闭后使用 SetForegroundWindow 方法(与第一次调用的值)恢复焦点。当您通过系统托盘打开窗口时,这不起作用,因为用户实际上已经使系统托盘成为焦点。

我尝试使用 GetForegroundWindowGetWindowGetTopMostWindow 的组合来尝试导航 z 顺序以找到系统托盘之后的第二个窗口(假设系统托盘会跳到顶部,所以从逻辑上讲,下一个向下的将是原来的前面)。虽然我没有取得任何成功,但这些函数的结果毫无用处,因为它们似乎没有给我任何逻辑结构。

有人对我如何实现这一目标有任何想法吗?

我曾考虑过某种后台观察器,它只是坐下来监视作为前窗口并存储指向它的指针,但这充其量是不稳定的。

这是在 Windows 上(我个人使用 x64 Server 2008)和 .Net 3.5。


我这样做是为了返回上一个窗口

1
SendKeys.Send("%{TAB}");

我知道这不是"解决方案",而是在一定程度上达到目的。


虽然这可能是一个很好的可用性功能,但您可能知道,在 Windows 7 中,托盘在桌面上的位置将变得(非常)不那么显眼。

真正做到这一点的唯一方法是监视 Windows 消息并跟踪在您的应用程序获得焦点之前哪个窗口获得了焦点。除了 AFAIK,您无能为力。


我查看了所有系统托盘图标,它们的行为与您的程序相同。搞乱 Windows 焦点管理很麻烦,在尝试更改标准行为之前,您可能需要三思(或更多)。