2010-08-31 3 views
1

Мне нужна помощь с WM_KEYDOWN, я хочу удалить «паузу» между первым нажатием клавиши и повторяющимися нажатиями клавиш.Нужна помощь с WM_KEYDOWN

Если вы постоянно удерживаете нажатой кнопку, я хочу, чтобы программа реализовала ее напрямую.

Im пытается сделать игру с directx. Скажите, пожалуйста, если я должен использовать что-то еще, кроме WM_KEYDOWN.

+0

Частота повторения клавиш и частота повторения клавиш обычно устанавливаются в BIOS –

ответ

2

Пожалуйста, определите "постоянно". Если пользователь нажмет кнопку и немедленно отпустит ее, вы сразу получите WM_KEYDOWN и WM_KEYUP. В противном случае, если пользователь не выпустит ключ в течение некоторого периода времени, Windows обнаружит его с помощью некоторого внутреннего таймера и продолжит загораться WM_KEYDOWN событий до тех пор, пока не будет отпущена кнопка.

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

Что вы можете сделать, однако, это игнорировать непрерывные события WM_KEYDOWN из Windows и лечить кнопку как нажатую и не отпускать, пока вы не получите событие WM_KEYUP. Назовем это ставкой или, что еще лучше, оптимизацией ветви.

2

Возможно, это не совсем то, что вы после, но не можете ли вы просто игнорировать дальнейшие сообщения WM_KEYDOWN, пока не получите WM_KEYUP?

1

Вы можете использовать логические переменные и установить их в true, когда ключ не работает. Если значение переменной равно true, вы прекратите выполнение действия. И когда ключ вставлен, вы установите для переменной значение false.

// ... 
some switch 
// ... 
case WM_KEYDOWN: 
    if (!keydown) { 
     // do the magic 
     keydown=true; 
    } 
break; 
case WM_KEYUP: 
    keydown=false; 
break; 

Конечно, если вы хотите сделать что-то постоянно, вы должны, например, установить таймер в заявлении, если (! KeyDown) и остановить таймер, когда пользователь отпускает клавишу.

0

Существует флаг с WM_KEYDOWN, указывающий, является ли WM_KEYDOWN первым или повторным. Просто найдите MSDN для WM_KEYDOWN, вы должны его найти.

От MSDN: lParam бит 30: Указывает предыдущее состояние ключа. Значение равно 1, если клавиша опущена до отправки сообщения или равна нулю, если клавиша поднята.