Похоже, что Zandronum не принимает виртуальные ключи для отправки ему, когда игра запущена (не поставлена на паузу). Я не уверен, но кажется, что виртуальные клавиши могут быть оконными сообщениями, как сказал Эндрю Мортон (или они, по крайней мере, что-то похожее...). Обходной путь состоял в том, чтобы отправить аппаратный код сканирования вместо a код виртуального ключа а>.
аппаратный скан-код — это код, отправляемый реальной клавиатурой при нажатии клавиши, а виртуальный код клавиши — это клавиша, которую система интерпретирует из скан-кода ( ссылка).
Итак, мне удалось отправить нажатия клавиш в Zandronum (как в полноэкранном, так и в оконном режиме), используя несколько функций WinAPI:
SendInput()
, который используется для отправки фактического ввода с клавиатуры.
MapVirtualKeyEx()
, который используется для преобразования кодов клавиш в коды сканирования или наоборот.
GetKeyboardLayout()
, который используется для получения текущей раскладки клавиатуры пользователя (например, у меня шведская клавиатура).
Используя приведенный ниже вспомогательный класс (или, правильнее сказать, оболочку), который я создал, вы теперь можете отправлять нажатия клавиш (аппаратные или нет) простым способом с большим набором клавиш, чем то, что включает SendKeys.Send()
. Вы можете использовать любой ключ в System.Windows.Forms.Keys
перечисление.
Это было протестировано с Zandronum и полностью работает:
InputHelper.Keyboard.PressKey(Keys.Escape, True) 'True = Send key as hardware scan code.
ИЗМЕНИТЬ (20 сентября 2019 г.)
InputHelper
уже давно перемещен в собственную библиотеку. Ответ был обновлен, чтобы отразить это изменение.
Загрузите InputHelper с GitHub:
https://github.com/Visual-Vincent/InputHelper/releases
Ради интереса мне также удалось найти список кодов сканирования в MSDN: https://msdn.microsoft.com/en-us/library/aa299374(v=vs.60).aspx
Поскольку я сам фанат Doom и знаком с тем, как это работает, возможно, вам следует (согласно вашему старому вопросу) также убедиться, что вы выбрали New Game
в меню, прежде чем нажать Enter?
Zandronum знает названия пунктов меню, поэтому вам просто нужно дать ему первую букву, и он перейдет к пункту, начинающемуся с нее:
InputHelper.Keyboard.PressKey(Keys.Escape, True) 'Open the menu.
System.Threading.Thread.Sleep(100) 'Small delay to let the menu open.
InputHelper.Keyboard.PressKey(Keys.N, True) 'Jump to the "New Game" menu item.
InputHelper.Keyboard.PressKey(Keys.Enter, True) 'Go into the "New Game" menu.
InputHelper.Keyboard.PressKey(Keys.Enter, True) 'Start a new game.
Я протестировал приведенный выше код в игре в полноэкранном режиме. Работает как шарм.
person
Visual Vincent
schedule
01.10.2016
SendKeys
, и сSendInput
. Вы работаете в полноэкранном режиме или в оконном режиме? - person Visual Vincent   schedule 01.10.2016SendInput
должен работать. - person Visual Vincent   schedule 01.10.2016SendInput
. - person Visual Vincent   schedule 01.10.2016SendInput
не использует сообщения Window. Согласно MSDN : Функция SendInput последовательно вставляет события из структур INPUT в поток ввода с клавиатуры или мыши. -- Опять же, это работает для закрытия меню, но не для его открытия. - person Visual Vincent   schedule 01.10.2016