Хорошо, поэтому в основном я хочу получить текст клавиатуры. Как ввод текста в текстовое поле или что-то в этом роде. Я только пишу свою игру для окон. Я проигнорировал использование Guide.BeginShowKeyboardInput, потому что он нарушает ощущение автономной игры, и тот факт, что Guide всегда показывает кнопки XBOX, тоже мне не подходит. Да это самый простой способ, но мне это не нравится.
Далее я попытался использовать System.Windows.Forms.NativeWindow. Я создал класс, унаследованный от него, и передал ему дескриптор окна Games, реализовал функцию WndProc, чтобы поймать WM_CHAR (или WM_KEYDOWN), хотя WndProc получил приглашение для других сообщений, WM_CHAR и WM_KEYDOWN так и не сделали. Поэтому мне пришлось отказаться от этой идеи, и кроме того, я также ссылался на все формы Windows, что означало излишнюю разметку памяти.
Итак, моя последняя идея заключалась в том, чтобы создать нить уровня, низкоуровневую клавиатуру. Это было самым успешным до сих пор. Я получаю сообщение WM_KEYDOWN (еще не проверенный WM_CHAR) переводит виртуальный ключевой код с помощью Win32 funcation MapVirtualKey на char. И я получаю текст! (Я просто печатаю с Debug.Write на данный момент)
Пара проблем. Это как будто я закрыл колпачок и не реагировал на клавиши переключения. (Конечно, однако, это не так, просто есть только один виртуальный Key Code для каждого ключа, поэтому при переводе он имеет только один вывод), и он добавляет накладные расходы, поскольку он присоединяется к списку подключений Windows и не так быстро, как я Как бы это ни было, но медленность может быть больше из-за Debug.Write.
Кто-нибудь еще подошел к этому и решил его, не прибегая к экранной клавиатуре? или у кого-нибудь есть другие идеи для меня, чтобы попробовать?
заблаговременно.
Вопрос, заданный Джимми
Возможно, я не понимаю этот вопрос, но почему вы не можете использовать классы XNA Keyboard и KeyboardState?
Мой комментарий:
Это потому, что, хотя вы можете читать keystates, вы не можете получить доступ к напечатанному тексту как и как он набирается пользователем.
Итак, позвольте мне уточнить. Я хочу реализовать возможность чтения текстового ввода от пользователя, как если бы они вводили текст в текстовое поле, это окна. Клавиатура и класс KeyboardState получают состояния всех ключей, но мне нужно будет сопоставить каждый ключ и комбинацию с символьным представлением. Это происходит, когда пользователь не использует тот же язык клавиатуры, что и я, особенно с символами (мои двойные кавычки имеют сдвиг + 2, а у американских клавиатур есть где-то рядом с ключом возврата).
Кажется, мой оконный крючок - это путь, просто причина, по которой я не получал WM_CHAR, потому что насос сообщений XNA не выполняет перевод сообщения.
Добавление TranslateMessage в каждый раз, когда я получил сообщение WM _
KEYDOWN, означало, что я получил свое сообщение WM_CHAR, затем использовал это, чтобы запустить событие с символом в моем классе MessageHook, к которому подписал класс KeyboardBuffer, который затем буферизует это текстовый буфер: D (или StringBuilder, но результат тот же)
Итак, у меня все работает так, как я хочу.
Большое спасибо Джимми за ссылку на очень информативный поток.