Получение состояния клавиатуры в C # с использованием DirectInput? - PullRequest
0 голосов
/ 17 декабря 2010

Мне нужно получить состояние клавиатуры, когда клавиша нажимается в определенной форме достаточно быстро - достаточно быстро, чтобы стандартные события KeyUp / KeyDown для оконных форм были недостаточно быстрыми. Мне сказали попробовать DirectInput, но у меня нет опыта работы с библиотекой или какой-либо многопоточности, поэтому я не уверен, как начать вообще.

Как бы настроить поток, который вызывал функцию в форме каждый раз, когда DirectInput регистрирует изменения в состоянии клавиатуры? Я знаю, как инициализировать устройство, и что SetEventNotification - это почти то, чего я хочу, но я не знаю, как его использовать.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 17 декабря 2010

Решение, вероятно, зависит от того, что вы имеете в виду, когда говорите, что события нажатия клавиш вверх / вниз для окон не достаточно быстрые. Они, безусловно, работают с разрешением менее миллисекунды - что значительно быстрее, чем у большинства людей - так чего же вы надеетесь достичь, читая ввод «быстрее»?

Вы уверены, что ваш цикл событий или код не только замедляют ответ?

Вы можете достичь аналогичных (идентичных?) Скоростей опроса DirectInput состояния клавиатуры, используя функции Windows GetAsyncKeyState / GetKeyState. Я не использовал последнюю версию DirectInput, но я уверен, что более ранние версии просто использовали те же события Win32 для состояния без опроса клавиатуры. Основное преимущество DirectInput заключается в том, что он обеспечивает общие абстракции для всех видов устройств ввода - он не предназначен для «быстрого» ввода с клавиатуры (что бы это ни значило).

Из собственной документации Microsoft видно, что ' Использование DirectInput для ввода с клавиатуры и мыши не рекомендуется ... '

0 голосов
/ 17 декабря 2010

Это может помочь вам, поскольку вам не нужно использовать DirectInput:

[DllImport("user32.dll")]
private static 
extern short GetAsyncKeyState(System.Int32 vKey);

http://msdn.microsoft.com/en-us/library/ms646293(v=vs.85).aspx

надеюсь, это поможет

...