【问题标题】:SendMessage WM_MOUSEMOVE not working as expectedSendMessage WM_MOUSEMOVE 未按预期工作
【发布时间】:2010-10-22 01:29:49
【问题描述】:

当将 WM_MOUSEMOVE 消息发送到应用程序的客户区(在本例中为 Open Office Writer)时,图像会闪烁,就像鼠标在指定坐标上一样,但不会停留在该状态。代码是:

PostMessage(hWndClient, WM_MOUSEMOVE, 0, MAKEWORD(x, y))

其中 x 和 y 是相对于客户区的。

在循环中发送它仍然不起作用,因为鼠标悬停事件突出显示的区域只会闪烁。

任何帮助将不胜感激。

【问题讨论】:

  • 通过向 Open Office Writer 发送 WM_MOUSEMOVE 来实现什么目标?
  • 这是一种多用户 VNC 类型的东西,所以不幸的是使用 SetCursorPos 或其他方法移动光标是行不通的。
  • 你设法让它工作了吗?我正在自动化的其中一个控件在悬停之前无法工作,因此我需要让程序相信按钮正在使用 Windows 消息悬停。

标签: c windows-vista sendmessage


【解决方案1】:

应用程序可能会触发各种其他事件。也许它想看到 WM_MOUSEHOVER 等......已经有一段时间了,但我记得关于这些事件中的一些是如何实现的真的很麻烦 - 就像有一个单独的线程轮询鼠标并在鼠标时生成 WM_MOUSELEAVE 事件不再是窗外。你也可能被类似的东西咬伤。也有可能是应用程序本身在接收到事件时轮询鼠标的真实位置。

根据您要执行的操作,也许您可​​以以编程方式移动鼠标,而不仅仅是尝试伪造事件。不幸的是,我不记得这方面的 API,但我确信这是可能的。

【讨论】:

  • 你是对的,应用程序在 WM_MOUSEMOVE 消息之后调用 GetWindowPos。
【解决方案2】:

我在我的主窗口中使用了这样的东西,看起来很有帮助......在 WM_MOUSEMOVE 中:

POINT Point;
GetCursorPos(&Point);
ScreenToClient(hHwnd, &Point);
int X = Point.x;
int Y = Point.y;

【讨论】:

    【解决方案3】:

    试试这个:PostMessage(hWndClient, WM_MOUSEMOVE, MK_LBUTTON, MAKELONG(x, y)),因为 postion 是一个 32 位整数,低 16 位是 x,高 16 位是 y,也许你应该使用 MAKELONG 而不是 MAKEWORD。 检查WM_MOUSEMOVE

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 2022-01-24
      • 2015-05-11
      • 2020-05-15
      • 2014-10-31
      • 2018-02-12
      • 2014-01-20
      • 2015-01-13
      • 2013-08-01
      相关资源
      最近更新 更多