|
|
1
26
要枚举顶级窗口,应使用 EnumWindows 而不是getTopWindow/getNextWindow,因为EnumWindows返回窗口状态的一致视图。当Windows在迭代过程中更改z顺序时,您可能会遇到使用gettopwindow/getnextwindow获取不一致信息(如报告已删除的窗口)或无限循环的风险。 EnumWindows使用回调。每次调用回调都会得到一个窗口句柄。通过将该句柄传递给 GetWindowRect . 回调以z顺序构建窗口位置列表。 您可以使用轮询,并重复构建窗口列表。或者,设置cbthook以接收窗口更改通知。并非所有CBT通知都会导致顶级窗口的顺序、位置或可见性发生更改,因此最好重新运行enmwindows以z顺序构建新的窗口位置列表,并在进一步处理列表之前将其与上一个列表进行比较,以便只有在发生真正的更改时才能进行进一步的处理。 注意,对于挂钩,不能混合32位和64位。如果您运行的是32位应用程序,那么您将收到来自32位进程的通知。同样,对于64位。因此,如果您想在64位机器上监视整个系统,似乎需要运行两个应用程序。我的推理来自于阅读:
当您在Java中实现这一点时,您可能需要查看 JNA 它使对本地库的访问变得更简单(Java中的代码调用),并消除了对自己本地JNI DLL的需要。 编辑:您询问了代码的数量和编写时间。下面是Java中的代码
我已经将大部分相关的类和接口放在内部类中,以保持示例的紧凑性和可粘贴性,以便立即编译。在实际的实现中,它们将是常规的顶级类。命令行应用程序打印出可见窗口及其位置。我在32位JVM和64位JVM上运行它,得到了相同的结果。 edit2:更新了代码以包含z顺序。它确实使用了GetNextWindow。在生产应用程序中,您可能应该为下一个和上一个值调用两次getNextWindow,并检查它们是否一致以及是否是有效的窗口句柄。 |
|
|
2
7
是的,不过你得注册一个 hook 为了得到你想要的关于回调的信息。您可能需要使用 CBTProc Callback Hook ,在以下情况下调用:
但是请注意,我不相信这样的钩子在控制台窗口上工作,因为它们是内核的域,而不是win32。
对。你可以使用 GetTopWindow 和 GetNextWindow 函数以正确的Z顺序获取桌面上的所有窗口句柄。
见第一个答案:)
见第一个答案:)
几百行C,还有几个小时。尽管我必须使用某种形式的投票——但我以前从未做过钩子。如果我需要钩子的话,需要更长的时间。 |
|
|
3
1
我记得2006年有一个实用程序winobj,作为系统内部构件的一部分,它可能满足了您的需要。部分公用设施由作者(MarkRussinovich)提供源代码。 从那时起,他的公司就被微软收购了,所以我不知道源代码是否仍然可用。 此外,以下内容可能值得检查: http://msdn.microsoft.com/en-us/library/aa264396(VS.60).aspx |
|
|
user29759326 · 如何返回递归函数中的最后一个值? 1 年前 |
|
|
malife89 · 将java中的字符串读取为正确的日期格式 1 年前 |
|
|
Tim · 在java中,有没有更快的方法将字节数组写入文件? 1 年前 |
|
|
rudraraj · java中未声明最终变量 1 年前 |
|
|
Bala Ji · 以下BFS的实施效率如何? 1 年前 |