【问题标题】:Win32 - Can one Enumerate the windows belonging to the calling thread?Win32 - 可以枚举属于调用线程的窗口吗?
【发布时间】:2011-05-31 16:56:53
【问题描述】:

来自 MSDN 上的 GetActiveWindow "检索附加到调用线程的消息队列的活动窗口的窗口句柄。"

我正在使用它的 Ruby API 编写 SketchUp 插件。目前正在尝试通过 Win32 对某些窗口进行一些调整。从 Ruby API 我对 SU 的窗口和线程的信息非常有限。只要 SketchUp 窗口有焦点,GetActiveWindow 就可以正常工作 - 否则会失败。

所以我正在寻找一种安全的方法来获取 SketchUp 窗口的句柄,无论它是否有焦点。

看到 GetActiveWindow 如何获取调用进程的活动窗口,我想知道是否可以枚举属于调用进程的窗口。然后我可以浏览结果并找到我的窗口。

或者,获取调用线程的进程 ID,这样我就可以枚举所有窗口并挑选出属于我的脚本运行所在线程的窗口。

有什么想法吗?

【问题讨论】:

    标签: ruby winapi


    【解决方案1】:

    您可以使用EnumWindows 查找所有顶级窗口。在 Ruby 中,win32-api 支持传入适当的回调。

    编辑:然后您可以使用GetWindowThreadProcessId 来确定每个窗口属于哪个进程。

    编辑:要确定运行脚本的进程的进程 ID,请使用 GetCurrentProcessId

    【讨论】:

    • 问题是我没有足够的信息来迭代 EnumWindows 并过滤掉所有窗口,因为可能有多个 SketchUp 实例正在运行 - 所以我需要找到属于我正在执行的脚本。
    • 对不起,我还没有完全清楚我的方案。但我遇到的整个问题是,我试图获取运行我的脚本的 SketchUp 进程的主窗口的窗口句柄。从我看到的获取窗口句柄或线程 ID 的 Win32API 方法中,我似乎总是需要其中之一 - 但我没有。
    • @thomthom:查看我的编辑。找出运行脚本的 SketchUp 进程的进程 ID 非常容易:它将是脚本中的当前进程 ID。
    • 谢谢。与 GetCurrentThreadId 一起应该可以让我找到我的窗口。
    猜你喜欢
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多