Restoring window focus back to previous owner
我在系统托盘中有一个应用程序,双击它会打开一个窗口,相当标准;但是,当您关闭窗口时,我希望在打开我的窗口之前获得焦点的窗口重新获得焦点。
如果我通过键盘快捷键弹出我的窗口,我可以在我的窗口显示之前使用 GetForegroundWindow API 调用来恢复之前关闭的焦点,然后在我的窗口关闭后使用 SetForegroundWindow 方法(与第一次调用的值)恢复焦点。当您通过系统托盘打开窗口时,这不起作用,因为用户实际上已经使系统托盘成为焦点。
我尝试使用 GetForegroundWindow、GetWindow 和 GetTopMostWindow 的组合来尝试导航 z 顺序以找到系统托盘之后的第二个窗口(假设系统托盘会跳到顶部,所以从逻辑上讲,下一个向下的将是原来的前面)。虽然我没有取得任何成功,但这些函数的结果毫无用处,因为它们似乎没有给我任何逻辑结构。
有人对我如何实现这一目标有任何想法吗?
我曾考虑过某种后台观察器,它只是坐下来监视作为前窗口并存储指向它的指针,但这充其量是不稳定的。
这是在 Windows 上(我个人使用 x64 Server 2008)和 .Net 3.5。
我这样做是为了返回上一个窗口
1
| SendKeys.Send("%{TAB}"); |
我知道这不是"解决方案",而是在一定程度上达到目的。
虽然这可能是一个很好的可用性功能,但您可能知道,在 Windows 7 中,托盘在桌面上的位置将变得(非常)不那么显眼。
真正做到这一点的唯一方法是监视 Windows 消息并跟踪在您的应用程序获得焦点之前哪个窗口获得了焦点。除了 AFAIK,您无能为力。
-
这就是我通过键盘快捷键启动时所做的,但是在使用托盘时,我之前关注的最后一个应用程序是托盘!我很确定不会有一个很好的解决方案,但无论如何它不是我的主要使用机制。
-
对于"监视 Windows 消息",我的意思是真正做到这一点。例如,您可以记住最后 4 个具有焦点的窗口,然后跳过系统托盘返回队列以获取在此之前具有焦点的窗口的句柄。虽然这并不容易,并且需要系统 API 调用
-
我试图做这样的事情,但我似乎无法获得正确的呼叫组合。我尝试使用从 GetTopWindow 工作的 GetWindow 来回走动,但没有任何运气。你有什么建议吗?
-
您可以让 Spy 尝试查看传递了哪些消息,但除此之外,我和您一样对此一无所知。
-
接受,因为虽然我没有得到我想要的答案,但这是我期望的答案。间谍也是一个不错的选择。谢谢。
我查看了所有系统托盘图标,它们的行为与您的程序相同。搞乱 Windows 焦点管理很麻烦,在尝试更改标准行为之前,您可能需要三思(或更多)。
- 我很欣赏这个警告,但这种行为是需要的。该应用程序充当叠加层,您可以使用它将文本插入具有焦点的应用程序中。如果您通过快捷键打开窗口,它会很好用,但系统托盘会杀死直通。
-
与您类似的应用程序是否有相同的问题?