【问题标题】:WM_MOUSEMOVE issues with positionWM_MOUSEMOVE 位置问题
【发布时间】:2017-08-26 02:17:48
【问题描述】:

我正在开发一个程序,该程序应该在后台模拟程序的基本鼠标输入(意思是,我想在目标接收输入时使用实际的鼠标和键盘在其他窗口中执行其他操作) .我需要做的一件事是将鼠标移动到特定的 (x,y) 点。

它似乎在大多数情况下都有效,但在屏幕的某个区域,该消息仅在某些时候正常工作。其他时候,它会移动到该区域内一致但错误的其他点。我正在阅读,有时它是相对的,但如果我反复发送垃圾邮件,它似乎确实有效。此外,在 Spy++ 中阅读时,我发送的实际移动鼠标的消息使用的似乎是绝对坐标。

我的功能在这里:

void mouseMove(short x, short y) {
    PostMessage(wnd, WM_MOUSEMOVE, 0, MAKELPARAM(x, y));
}

最好,我希望任何 (x,y) 都是绝对的,这样我就可以将该区域视为任何其他区域。但也可以将位置设置为相对于区域左上角的坐标。

我已经尝试了在 WM_MOUSEMOVE 之前在 Spy++ 中看到的所有发送到窗口的消息,但没有任何帮助。

我该如何处理?

编辑,因为细节可能不足以证明信息:

我按以下顺序发送这些消息:

  • WM_ACTIVATE 2 0
  • WM_MOUSEMOVE 0 MAKELPARAM(x,y)
  • WM_LBUTTONDOWN MK_LBUTTON MAKELPARAM(x,y)
  • WM_LBUTTONUP 0 MAKELPARAM(x,y)

我认为我最初的想法(错误的WM_SETCURSOR 区域)是错误的,因为 Spy++ 始终显示HTCLIENT 被使用。

我发现很多人都在尝试这样做(后台输入),而且大多数人似乎都被告知这是不可能的。这不是不可能的,我认为如果有人能一劳永逸地回答如何正确地做到这一点,那将是对很多人的一个大忙。

【问题讨论】:

  • @WeatherVane 我确实尝试过,即使在该地区的点 x 和 y 也是通话前的样子。不过,我仍然非常相信这有点相关。
  • 你有什么特别的问题吗(x,y)?我想我知道一些原因和解决方法,但在我听起来很愚蠢之前,你能给我一些关于你到底在做什么的更多信息。在某些情况下,ScreenToClient 的返回值也可能相同,例如您将窗口放在角落,然后屏幕和客户端的 0,0 可以相同。
  • 基本上我有HWND window;,我想从一个单独的应用程序向它发送输入。我正在使用 PostMessage 更改鼠标的位置,但 WM_MOUSEMOVE 似乎在窗口的一个特定区域(2D 正方形)中奇怪地工作(将鼠标置于错误的位置)。据我所知,它只在这一地区表现得很奇怪(可能还有其他地区,但至少在某些地区表现良好)。
  • 我认为你应该在拒绝之前了解 UI 自动化。

标签: c windows winapi visual-c++ user-input


【解决方案1】:

合成击键、鼠标移动和按钮点击。

   UINT WINAPI SendInput(
      _In_ UINT    nInputs,
      _In_ LPINPUT pInputs,
      _In_ int     cbSize
    );

PostMessage 函数。在消息队列中放置(发布)消息 与创建指定窗口的线程相关联,并且 不等待线程处理消息就返回。

要使 PostMessage 工作,您需要将其作为您可以使用 SetWindowHook 实现的目标,但这些链接将完成工作:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx https://msdn.microsoft.com/en-us/library/ms171542(v=vs.110).aspx

【讨论】:

  • 注意“当它停留在后台时。”除非我弄错了,否则唯一的方法就是使用 Send/PostMessage。
  • 进程不是windows窗体,该区域的ScreenToClient输出与调用前相同的(x,y)。很有可能它正在做一些非常hacky的事情,但我对什至可以做什么感到困惑。
  • 所有这些都不能将输入发送到后台应用程序。我需要这个在窗口在后台和我做其他事情时工作。我以前没有见过 DirectX 的方式,所以可能有办法让它传递到一个窗口(将查看),但我假设你的意思是早期的答案。
  • 还有另一种方法也可以考虑 hacky 的东西,比如你使用 SetWindowsHookEx 将你的应用程序附加到目标的进程和主 GUI 线程,你应该在一个单独的 .dll 中完成所有这些,然后你可以使用PostMessage 并将消息发送到您自己的应用程序,然后您可以使用 RegisterWindowMessage ,...但这是一个漫长的越野方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多