Какой WM_Message использовать? - PullRequest
1 голос
/ 28 декабря 2011

Я работаю над загрузчиком клиента для игры, не созданной мной. Я построил библиотеку событий мыши и клавиш для отправки клиенту, и они по большей части работают. Однако есть один бит, который я не могу понять.

Я сделал печатную часть своего кода следующим образом:

[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);

//Send each character of string one at a time
foreach(Char c in Input)
    PostMessage(mainwnd, (uint)WM.CHAR, c, 1);
//Send final enter key to send message in game
PostMessage(mainwnd, (uint)WM.CHAR, 0x0D, 1);

Это прекрасно работает, но есть две вещи, которые не учитываются.

  1. В игре вам необходимо нажать клавишу ввода, прежде чем набирать текст, чтобы открыть чат
  2. Есть горячие клавиши для открытия меню

Я пробовал что-то вроде PostMessage(mainwnd, (uint)WM.CHAR, 0x0D, 1);, чтобы отправить начальный ключ ввода, но игра не обрабатывает его. То же самое происходит, если я использую PostMessage, чтобы попытаться открыть меню. Ничего не анализируется, если окно чата уже не открыто перед отправкой сообщения.

Я полагаю, что я использую неправильное сообщение WM_Message, но не могу найти, какой мне нужен. Я пробовал:

  1. WM_CHAR
  2. WM_SYSCHAR
  3. WM_MENUCHAR
  4. WM_HOTKEY
  5. WM_APPCOMMAND
  6. WM_KEYDOWN, за которым следует WM_KEYUP

И, может быть, несколько других, но не повезло. Кто-нибудь знает, какая команда может работать?

Ответы [ 2 ]

4 голосов
/ 28 декабря 2011

Тебе придется повезти, чтобы это сработало. Ввод с клавиатуры - это не просто сообщение. Это также влияет (среди прочего) GetKeyboardState и GetAsyncKeyState - и имитация ввода с ними нетривиальна. И если фокус клавиатуры находится где-то в другом месте, он может все испортить.

Вы можете попробовать опубликовать WM_KEYDOWN и WM_KEYUP, чтобы создать сообщение более низкого уровня.

Нижний уровень по-прежнему равен SendInput, который имитирует ввод с клавиатуры. Фокус клавиатуры должен быть в правильном месте, иначе он отправит ввод в неправильное окно.

0 голосов
/ 28 декабря 2011

Попробуйте WM_KEYDOWN, затем WM_KEYUP. С кодом VK_ENTER (думаю).

...