На днях появился у меня пад Logitech F510 (надоело в хоккей на клаве играть *warning!* ) И вот по своей специфике, акрамя игровых баталий, решил я покодить его DirectInput'ум.
Но вопрос не по паду
Столкнулся я просто с вопросом по обработке клавиатуры. Сразу скажу, что сама мелкософт советует обрабатывать лучше WM_KEYDOWN и т.д., чем юзать для этих целей DI, а для казуалок всяких достаточно WM'ки обрабатывать с головой. Думаю, что многие с этим согласятся. Хотя все зависит от задачи...
Но я хочу кое в чем разобраться, ради своего интереса.
В обработке WM_KEYDOWN wParam == vk, а lParam - флаговый параметр. Так вот в 30 бите lParam'а можно узнать, была ли уже нажата данная клавиша до прихода этого сообщения в стек. Круто
можно обрабатывать различные вариации типа: IsKeyDown(key), IsKeyPressed(key).С DI обычно используют непосредственный опрос клавиатуры. Так вот значения по нажатию в массив клавиш приходит 128 для any key -> 0x80, то бишь мы и проверяем (buf[key] & 0x80) != 0. А как узнать аля 30 бит в WM_KEYDOWN? Не уж то надо обрабатывать это вручную, запоминать все состояния? Так как, когда я физический нажал клавишу и быстро отпустил, прошли кажется мгновения, но так как опрос происходит довольно быстро (~ ваш FPS), то соответственно посчиталось, что клавиша нажата была ~ == FPS. Не катит =)
Буферизированный опрос пока еще "не курил", хотя когда-то давно и "курил"
но все забыл.

и немного не улавливаю мысль твою
для нужд всей системы, а перед непосредственным передвижением можно снять состояние GetAsyncKeyState и узнать интересующие меня клавиши, так?
Может кто-нибудь попробует мне немного объяснить про это, как на практике это работает? Так как
Для клавы таки лучше юзать WM_KEYDOWN/WM_KEYUP, поллить такие вещи чревато потерей событий, особенно без буферизованного ввода -- действительно будут терятся события.
Но если уж поллить, то придётся запоминать состояния и на ручной тяге аккуратно генерить "евенты" (up/down) самому.
Для is-key-pressed можно просто GetAsyncKeyState() юзать и не морочится с директ-инпутом.