4

我正在尝试向游戏发送消息(以自动化文本命令),问题是我无法弄清楚如何使用来自 spy++ 的信息来编写 C# sendmessage 函数。

我能够使用 spy++ 来获取 00220540 S WM_SETCURSOR hwnd:0024052C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE

任何人都可以提供这意味着什么的细目,以及如何在 C# 中将消息发送到游戏?

编辑:

我发现我正在查看错误的过程。我没有查看 javaw.exe,而是查看了实际游戏。

这是按 t 的代码:

<00919> 0038062A WM_INPUT nInputCode:RIM_INPUT hRawInput:189E0973
<00920> 0024052 P WM_KEYUP nVirtKey:'T' cRepeat:1 ScanCode:14fExtended:0fAltDown:0fRepeat:1fUp:1
4

1 回答 1

8

因此,让我们从Pinvoke.net的SendMessage签名开始:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

它接受一个窗口句柄 hWnd、一个消息 ID Msg 和两个通用参数 wParam 和 lParam,它们根据消息 ID 改变含义。

spy++ 向您展示的是发送到 SendMessage 的参数。如您所见,它不会显示 wParam 和 lParam,而是显示 hwnd、nHittest 和 wMouseMsg。这是因为 Spy++ 知道 wParam 和 lParam 参数对WM_SETCURSOR消息的实际含义,并且正在为您解码它们。

因此,解码 Spy++ 发送的每一部分:

  1. 00220540- 接收消息的窗口句柄 - hWnd 参数。
  2. S- 这意味着它是通过 SendMessage() 发送的,而不是通过 PostMessage()发布的。请参阅http://msdn.microsoft.com/en-us/library/aa265147(v=vs.60).aspx
  3. WM_SETCURSOR- 消息 ID - Msg 参数。
  4. hwnd:0024052C- 包含光标的窗口句柄 - wParam 参数。
  5. nHittest:HTCLIENT- 命中测试代码 - lParam 参数的低位字。
  6. wMouseMsg:WM_MOUSEMOVE- 鼠标消息 - lParam 参数的高位字。

您将消息发送到窗口的方式是:

enum WindowMessages {
    WM_SETCURSOR  = 0x0020,
    WM_MOUSEMOVE  = 0x0200,
    ....
}

enum HitTestCodes {
    HTCLIENT = 1,
    ....
}

....
IntPtr hWnd = [get your window handle some how]
int lParam = ((int)WindowMessages.WM_MOUSEMOVE) << 16 + (int)HitTestCodes.HTCLIENT;
SendMessage(hWnd, (uint)WindowMessages.WM_SETCURSOR, hWnd, (IntPtr)lParam);

要了解其他消息的含义,您可以在 Msdn.com 上搜索 Windows 文档中的消息。

因此,在回答完所有这些之后,我认为这与向您尝试控制的游戏发送密钥没有任何关系。WM_SETCURSOR 与键盘输入没有任何关系。

于 2011-02-02T04:00:10.733 回答