Windows:如何获取所有可见窗口的列表?
(无论如何,请使用相关技术重新标记:我不知道它们:)
我可能会在稍后提出更详细的问题,关于具体细节,但现在我试图掌握“大局”:我正在寻找一种方法来枚举Windows上的“真正的可见窗口”。通过“真正的可见窗口”,我的意思是:用户称之为“窗口”。我需要一种方法来获取所有这些可见窗口的列表,以Z顺序排列。
请注意,我确实需要这样做。我已经在OS X上完成了它(这是一个非常令人头疼的事情,特别是如果你想支持OS X 10.4,因为OS X没有方便的Windows API),现在我需要在Windows下做到这一点。
下面是一个示例,假设屏幕上有三个可见窗口,如下所示:
+------------------------------------------+
| |
| +=============+ |
| | | |
| | A +--------------------------+
| | | |
| C | | B |
| | +--------------------------+
| | | |
+-----------| |----------------+
| |
+-------------+
然后我需要得到一个这样的列表:
windows B is at (210,40)
windows A is at (120,20)
windows C is at (0,0)
然后,如果用户(或操作系统)将窗口 A 置于最前面,则它变为:
+------------------------------------------+
| |
| +=============+ |
| | | |
| | A |---------------------+
| | | |
| C | | B |
| | |---------------------+
| | | |
+-----------| |----------------+
| |
+-------------+
我得到一个(理想情况下)回调给我这个:
windows A is at (120,20)
windows B is at (210,40)
windows C is at (0,0)
在OS X下执行此操作需要使用非常奇怪的黑客(例如强制用户打开“为辅助设备启用访问权限”!)但是我已经在OS X下完成了此操作并且它的工作原理(在OS X下,我没有设法在每次发生某些窗口更改时都获得回调,所以我正在轮询,但我让它工作)。
现在我想在Windows下这样做(我真的这样做,毫无疑问),我有几个问题:
这可以做到吗?
是否有记录良好的Windows API(并按照其规范工作)允许这样做?
每次窗口更改时注册回调是否容易?(如果它被调整大小,移动,带到后面/前面,或者弹出一个新窗口等。
会有什么陷阱?
我知道这个问题并不具体,这就是为什么我试图尽可能清楚地描述我的问题(包括你可以投票的漂亮的ASCII艺术):现在我正在看“大局”。我想知道在Windows下做这样的事情涉及什么。
额外的问题:想象一下,每次屏幕上有窗口更改时,您都需要编写一个小.exe将窗口名称/位置/大小写入临时文件,这样的程序大约用您选择的语言编写多长时间,您需要多长时间才能编写它?
(再一次,我试图让“大局”理解这里的工作原理)