【问题标题】:Change the mouse cursor on a window from another process on Windows从 Windows 上的另一个进程更改窗口上的鼠标光标
【发布时间】:2011-09-29 17:56:16
【问题描述】:

我有一个进程 A,它启动一个进程 B。我在 A 中加载了一个鼠标光标,并且我希望 A 在鼠标位于 B 窗口上时更改鼠标光标。有可能吗?

当鼠标悬停在 B 上时,我尝试从 A 调用 SetCursor,但即使我在 B 中处理 WM_SETCURSOR 消息,光标也不会改变。我错过了什么吗?

【问题讨论】:

    标签: windows winapi mouse-cursor


    【解决方案1】:

    应用程序可以控制自己的游标。从 A 调用 SetCursor() cannot 不可能工作。请注意,SetCursor() 没有指定要对哪个应用程序进行更改的参数。这是因为更改是在调用应用程序中进行的。

    您需要将代码注入 B 以实现所需的更改。

    【讨论】:

    • 我可以将功能编码到 B 中,而不是注入代码。但问题是我必须将数据注入B,因为我的游标加载在A,而不是B。
    • 你只需要找到一种方法将它加载到 B 中。这应该是你的问题。
    • 我想避免这种情况,但似乎我别无选择。
    【解决方案2】:

    窗口在另一个窗口上方时控制鼠标的唯一方法是捕获鼠标(请参阅SetCapture),或通过设置系统鼠标,但我非常怀疑您是否想要执行后者。

    不幸的是,捕获鼠标意味着您将所有鼠标事件发送到您的窗口而不是他们的窗口,因此他们的 GUI 无法使用。

    唯一的其他解决方案是 API 挂钩和代码注入 B,您可以在其中管理 WM_MOUSEMOVE 等任何消息并从应用程序本身调用 SetCursor,可能使用某种进程间通信方法从应用程序 A 获取要设置的光标。

    【讨论】:

    • 使用 SetCapture 对我来说不是问题,因为 A 已经处理了事件并在窗口上绘图;但问题是 SetCapture 似乎只适用于顶级窗口。
    【解决方案3】:

    您可以使用SetClassLongGCL_HCURSOR 更改子进程的默认光标。这不会影响孩子使用SetCursor 显式更改自己的光标时显示的内容,只是在未指定其他任何内容时显示的默认值。警告:程序可能永远不会显示其默认光标,在这种情况下这不会有任何效果。

    【讨论】:

    • 我已经试过了,但是因为我的光标是加载在A中的,看来B中的句柄无效,所以不起作用。
    猜你喜欢
    • 2011-02-09
    • 1970-01-01
    • 2012-09-22
    • 2010-11-15
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2018-11-12
    • 2010-11-16
    相关资源
    最近更新 更多