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

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 焦点管理很麻烦,在尝试更改标准行为之前,您可能需要三思(或更多)。

  • 我很欣赏这个警告,但这种行为是需要的。该应用程序充当叠加层,您可以使用它将文本插入具有焦点的应用程序中。如果您通过快捷键打开窗口,它会很好用,但系统托盘会杀死直通。
  • 与您类似的应用程序是否有相同的问题?


来源:https://www.codenong.com/621998/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9590.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?