因此,让我们从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++ 发送的每一部分:
00220540
- 接收消息的窗口句柄 - hWnd 参数。
S
- 这意味着它是通过 SendMessage() 发送的,而不是通过
PostMessage()发布的。请参阅http://msdn.microsoft.com/en-us/library/aa265147(v=vs.60).aspx
WM_SETCURSOR
- 消息 ID - Msg 参数。
hwnd:0024052C
- 包含光标的窗口句柄 - wParam 参数。
nHittest:HTCLIENT
- 命中测试代码 - lParam 参数的低位字。
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 与键盘输入没有任何关系。