jjzjj

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

codeneng 2023-03-28 原文

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 消息",我的意思是真正做到这一点。例如,您可以记住最后 4 个具有焦点的窗口,然后跳过系统托盘返回队列以获取在此之前具有焦点的窗口的句柄。虽然这并不容易,并且需要系统 API 调用
  • 我试图做这样的事情,但我似乎无法获得正确的呼叫组合。我尝试使用从 GetTopWindow 工作的 GetWindow 来回走动,但没有任何运气。你有什么建议吗?
  • 您可以让 Spy 尝试查看传递了哪些消息,但除此之外,我和您一样对此一无所知。
  • 接受,因为虽然我没有得到我想要的答案,但这是我期望的答案。间谍也是一个不错的选择。谢谢。


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

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

有关关于.net:将窗口焦点恢复到以前的所有者的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  4. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  5. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  6. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  7. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  8. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  9. .net - .NET 将如何影响 Python 和 Ruby 应用程序? - 2

    我很好奇.NET将如何影响Python和Ruby应用程序。用IronPython/IronRuby编写的应用程序是否会非常特定于.NET环境,以至于它们实际上将变得特定于平台?如果他们不使用任何.NET功能,那么IronPython/IronRuby相对于非.NET同类产品的优势是什么? 最佳答案 我不能说任何关于IronRuby的东西,但是大多数Python实现(如IronPython、Jython和PyPy)都试图尽可能忠实于CPython实现。不过,IronPython正在迅速成为这方面的佼佼者之一,并且在PlanetPyth

  10. ruby - (Ruby || Python) 窗口管理器 - 2

    我想用这两种语言中的任何一种(最好是ruby​​)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生

随机推荐