2011-12-28 3 views
1

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

Я сделал набрав часть моего кода это:

[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

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

ответ

4

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

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

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

+0

SendInput кажется лучшим вариантом, но, глядя на параметры, он не принимает дескриптор окна. Причина, по которой мне нужен PostMessage, - это то, что я могу отправить данные, пока экран был свернут. Возможно, я читаю это неправильно, но SendInput, похоже, нуждается в полном фокусе экрана. – ozdrgnaDiies

+1

Вы не понимаете; «Фокус» - это то, как работает ввод с клавиатуры. Только одно окно может принимать вводные сообщения клавиатуры за раз: окно с фокусом клавиатуры. Если вы пытаетесь отправить ввод с клавиатуры в нефокусированное окно, тогда вы играете в азартные игры, и в этом случае это звучит так, как будто вы проигрываете. – tenfour

+0

Еще один способ объяснить, что ... если вы можете указать окно, вы не очень хорошо имитируете ввод с клавиатуры. Драйвер клавиатуры ничего не знает о дескрипторах окна. – tenfour

0

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

+0

Я забыл упомянуть, что я тоже пробовал их. Это было мое второе предположение, когда Чар не работал. Добавьте его в список. – ozdrgnaDiies

 Смежные вопросы

  • Нет связанных вопросов^_^