【问题标题】:Can't simulate action properly. SendMessage in c# (spy++)无法正确模拟动作。 C#中的SendMessage(间谍++)
【发布时间】:2012-05-04 07:02:50
【问题描述】:

我在游戏过程中模拟这个动作时遇到了问题: - mouse_down - 鼠标移动 - mouse_up

当我手动执行时,这就是 spy++ 输出:

mouse_down:

鼠标移动:

mouse_up:

所以我尝试使用以下代码来模拟它 start x,y: (618,392) final x,y: (618,432) 但它不起作用。

uint Iparm = makeDWord((ushort)x, (ushort)y);
IntPtr xd = new IntPtr(Iparm);
uint Iparm2 = makeDWord((ushort)x2, (ushort)y2);
IntPtr xd2 = new IntPtr(Iparm2);

SendMessage(UltraBot.p, (uint)0x201, (IntPtr)0x1, xd); // down button (start x,y)
SendMessage(UltraBot.p, (uint)0x200, (IntPtr)0x1, xd2); // move (final x,y)
SendMessage(UltraBot.p, (uint)0x202, (IntPtr)0x0, xd2); // up button (final x,y)

这是使用代码后的 spy++ 输出:

我真的不知道为什么它不起作用。一段时间以来,我一直在使用这种方式来模拟按键,例如:ctrl+q、鼠标点击等操作都没有任何问题。更重要的是,它对我有用一次,但只有一次。我已经卡在这里了。感谢您的帮助:)

【问题讨论】:

  • 游戏通常不使用 windows 消息来获取用户输入。

标签: c# .net winapi sendmessage spy++


【解决方案1】:

您不能通过使用SendMessage 函数发送鼠标消息(例如WM_LBUTTONDOWNWM_MOUSEMOVE)来模拟鼠标输入。

是的,当您使用 Spy++ 监视消息时,看起来就是这样,但 there's a lot more going on behind the scenes

要正确模拟鼠标或键盘输入,您需要使用SendInput function。从 C# 调用它的 P/Invoke 声明如下所示:

[DllImport("user32.dll", SetLastError = true)]
static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

【讨论】:

  • 在使用 SendInput 时我不需要聚焦游戏窗口吗?
  • 不,你没有。 SendInput 函数不是这样工作的。它与SendMessage 不同。 @pat
  • 实际上,sendMessage 现在对我有用,我添加了一些睡眠(即使窗口最小化也有效)。但我也会尝试 SendInput,如果你给我一个使用它的例子会更好(???)
  • SendMessage无法正常工作以模拟键盘和鼠标输入。如果你成功了,那只是偶然。链接文档中有一个示例。
  • 我可以在 SendInput 函数中指定我想发送输入的窗口吗?即使窗口最小化也可以发送该输入吗?我在网络上的任何地方都找不到 SendInput 的参数,包括指向 MainWindowHandle 或 BaseModule 指针的指针。使用 SendMessage,我可以发送相对于窗口的输入(例如,在游戏的左上角单击鼠标单击 x=0,y=0)。 SendInput 可以吗?
猜你喜欢
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 2020-10-26
相关资源
最近更新 更多