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、およびメッセージ ID に基づいて意味を変更する 2 つの汎用パラメーター wParam と lParam を取ります。

spy++ が表示しているのは、SendMessage に送信されたパラメーターです。ご覧のとおり、wParam と lParam は表示されませんが、hwnd、nHittest、wMouseMsg は表示されます。これは、Spy++ がWM_SETCURSORメッセージの wParam パラメーターと lParam パラメーターが実際に何を意味するかを認識しており、それらをデコードしているためです。

したがって、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- カーソルを含む Window のハンドル - 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 に答える