恢复窗口焦点回到前一个所有者

时间:2009-03-07 15:31:05

标签: .net windows winapi

我有一个位于系统托盘中的应用程序,双击时会打开一个相当标准的窗口;然而,当你关闭窗口时,我希望在之前关注的窗口被打开以获得后焦距。

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

我尝试使用GetForegroundWindowGetWindowGetTopMostWindow的组合来尝试导航z顺序以找到系统托盘后面的第二个窗口(继续假设系统托盘已跳到顶部,所以逻辑上下一个将是原始前端。我没有取得任何成功,这些功能的结果非常无用,因为它们似乎没有给我任何逻辑结构。

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

我曾考虑过某种背景观察者,它只是坐着并监视哪个是前窗并存储一个指向它的指针,但这最多只会是片状。

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

3 个答案:

答案 0 :(得分:2)

虽然这可能是一个很好的可用性功能,但您可能知道,在Windows 7中,托盘将在桌面上获得一个(很少)突出的位置。

实际执行此操作的唯一方法是监视Windows消息并在应用程序获得焦点之前跟踪哪个窗口具有焦点。除了AFAIK之外,你无能为力。

答案 1 :(得分:2)

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

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

我知道这不是'解决方案',而是在某种程度上达到目的。

答案 2 :(得分:1)

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