Отправить сообщение взято из Spy ++ - PullRequest
2 голосов
/ 02 февраля 2011

Эй, ребята, я пытаюсь отправить сообщение в игру (для автоматизации текстовых команд), проблема в том, что я не могу понять, как использовать информацию из spy ++ для написания функции sendmessage на C #.
Я смог использовать Spy ++, чтобы получить 00220540 S WM_SETCURSOR hwnd:0024052C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
Может ли кто-нибудь представить суть того, что это значит, и как отправить сообщение в игру на c #?

EDIT: Я узнал, что я смотрю на неправильный процесс. Вместо того, чтобы смотреть на 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

Спасибо
Max

1 Ответ

6 голосов
/ 02 февраля 2011

Итак, давайте начнем с подписи для SendMessage , от Pinvoke.net :

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

Это берет дескриптор окна, hWnd, идентификатор сообщения,Msg и два универсальных параметра wParam и lParam, которые меняют значения в зависимости от идентификатора сообщения.

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 - идентификатор сообщения - параметр 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 не имеет ничего общего с вводом с клавиатуры.

...