Ben*_*Ben 3 c# pinvoke sendmessage spy++
嘿伙计们,我正在尝试向游戏发送消息(自动化文本命令),问题是我无法弄清楚如何使用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
Run Code Online (Sandbox Code Playgroud)
谢谢,
马克斯
所以让我们从Pinvoke.net开始使用SendMessage的签名:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
Run Code Online (Sandbox Code Playgroud)
它获取一个窗口句柄,hWnd,一个消息ID,Msg和两个通用参数wParam和lParam,它们根据消息ID改变meaing.
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).aspxWM_SETCURSOR - 消息ID - Msg参数.hwnd:0024052C - 包含光标的Window的句柄 - 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);
Run Code Online (Sandbox Code Playgroud)
要了解其他消息的含义,您可以在Msdn.com上搜索Windows文档中的消息.
因此,在回答了所有这些之后,我认为这与将你想要控制的游戏发送密钥无关.WM_SETCURSOR与键盘输入无关.