从几个初步测试看来 EnumWindows总是以相反的实例化顺序返回窗口,即最近实例化的窗口最先。这是一个有效的观察吗?如果是这样,是否适用于所有版本的 Windows?这是一个可靠的假设吗,即该行为是否记录在某处?
上下文:我正在处理这样一种情况,我正在触发第三方应用程序打开几个非模态窗口,我需要在这些窗口打开后向它们发送一些窗口消息,但我没有可靠的方法来识别它们,因为它们的窗口类和标题都不会不同,而且我也不知道它们的预期坐标。但是,如果我可以依赖 EnumWindows 的上述行为,我可以简单地使用 EnumWindows 返回的第一个句柄,其类和标题符合我的期望。这仍然留下了一些假设的循环漏洞,但我认为它已经足够好了。尽管如此,还是欢迎其他建议。
最佳答案
它以 Z 顺序返回它们。首先是设置了 WS_EX_TOPMOST 的最顶层窗口,直到设置了 WS_EX_TOPMOST 的最底层窗口,然后是没有设置 WS_EX_TOPMOST 的最顶层窗口,尽管到没有 WS_EX_TOPMOST 的最底部窗口。请注意,可见性不是决定因素,因此在 Z 顺序上比可见窗口更高的不可见窗口仍会出现在它之前。
编辑:
您不太可能随意使用它,只需从 EnumWindows 获取第一个返回值。您的新窗口不仅不太可能成为第一个返回窗口,而且您会遇到竞争条件,同时可能会打开其他窗口。但是,您可以保留应用程序所有已知窗口的列表,当您需要查找新打开的窗口时,调用 EnumWindows 并将窗口句柄与列表中的句柄进行比较。当您找到一个具有正确的类和标题(您甚至可以使用 GetWindowThreadProcessID 检查它是否属于正确的进程)但不在您的列表中时,您我们找到了新窗口。
不过,为了您的目的,您可以通过安装 CBT Hook 并观察 HCBT_CREATEWND 通知来获得更好的服务。请参阅 SetWindowsHookEx() 上的 MSDN 帮助和 the CBTProc callback获取更多信息。
枚举顺序的确定性级别:
这个问题的许多评论和其他答案都提到 MSDN 中缺乏关于 EnumWindows 返回窗口句柄的顺序的精确文档。事实上,EnumWindows 上的页面和 the EnumWindowsProc callback双方在这个问题上都保持沉默。我提供以下证据:
A C++ Q&A article in MSDN magazine具体说明:
EnumWindows enumerates the windows in top-down Z-order
EnumChildWindows 上的页面暗指备注部分的顺序:
A child window that is moved or repositioned in the Z order during the enumeration process will be properly enumerated.
这意味着顺序依赖于 Z 顺序。因为,在 hWndParent 参数的描述中,它是这样说的:
If this parameter is NULL, this function is equivalent to EnumWindows.
可以假设相同的逻辑和顺序适用于 EnumWindows。
当然,目前这一切都非常学术,因为 EnumWindows 可能不是解决 OP 问题的最佳解决方案——至少 EnumThreadWindows 可能是更合适——但我认为值得一提的是其他可能会看到这篇文章的人。
关于windows - EnumWindows 返回句柄的顺序有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/295996/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出
为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998
在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal