【发布时间】:2010-07-06 17:05:57
【问题描述】:
(一定要用相关技术重新标记:我不知道它们是哪些:)
稍后我可能会提出更详细的问题,关于具体细节,但现在我正试图掌握“大局”:我正在寻找一种方法来枚举 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 下执行此操作需要使用非常奇怪的 hack(例如强制用户打开“为辅助设备启用访问权限”!)但我已经在 OS X 下完成了它并且它工作(在 OS X 下,每次发生一些窗口更改时我都没有设法获得回调,所以我正在轮询,但我让它工作)。
现在我想在 Windows 下执行此操作(我真的这样做,毫无疑问),我有几个问题:
这可以做到吗?
是否有详细记录的 Windows API(并按照其规范工作)允许这样做?
每次窗口更改时注册回调是否容易? (如果它被调整大小、移动、移到后面/前面或者如果弹出一个新窗口等)
问题是什么?
我知道这个问题并不具体,这就是为什么我试图尽可能清楚地描述我的问题(包括你可以投票支持的漂亮的 ASCII 艺术):现在我正在查看“大图”。我想知道在Windows下做这样的事情涉及到什么。
额外问题:假设您需要编写一个很小的 .exe 将窗口名称/位置/大小写入临时文件,每次屏幕上出现窗口变化时,这样的程序需要多长时间大致使用您选择的语言,您需要写多长时间?
(再一次,我试图通过“大局”来了解这里的工作原理)
【问题讨论】:
-
没人吗?已经 +1 点赞和 1 个最爱... :)
-
好吧,我猜你会从 FindWindowEx 开始以 Z 顺序枚举所有窗口,然后使用 GetWindowLong 来获取窗口样式。显然你只会考虑带有 WS_VISIBLE 的窗口,也许还有 WS_CAPTION 之类的。
-
.net 框架是一种选择吗?我有一个简单的解决方案,大约需要十秒钟。
-
@Roddy:谢谢...实际上是因为我有点笨:我不知道如何在 SO 上发布图片(我不知道我应该在哪里“放“图片:我没有服务器/网页,我不知道我是否可以直接向SO“发送”图片)。所以,没有图片:让我们去看看一些 ASCII 艺术 :)
-
@Cyclone:.net 不是一个真正的选择:这是适用于 OS X 和 Windows 的东西(它是用 Java 编写的)。我有大约 99% 的 Java 代码和 1% 的平台特定代码(比如在 OS X 上找到窗口位置的代码,它已经在工作了)。但我仍然很好奇:您使用 .net 的解决方案是什么?也许你可以在这里发布它作为答案,指定它是.net?我肯定会赞成的!
标签: java windows cross-platform