#c #winapi
#c #winapi
Вопрос:
Я видел, что многие люди могли использовать цикл for для определения значения нажатой клавиши, например, это было бы GetAsyncKeyState(41), и поэтому они могли бы легко использовать цикл, но по какой-то причине это работает только для меня, если я ввожу GetAsyncKeyState(0x41) и т. Д., Этоя могу что-то с этим сделать, чтобы я мог перебирать его вместо того, чтобы вводить каждое значение по отдельности?
int main()
{
while(!GetAsyncKeyState(VK_F8))
{
for(int i=65; i<90; i )
{
if(GetAsyncKeyState(i))
{
log << "HELLO DER";
}
Sleep(200);
}
}
}
Комментарии:
1.
41
!=0x41
.0x41
==65
как у вас там в цикле.
Ответ №1:
41
и 0x41
это два совершенно разных значения. Второй — 0x41
шестнадцатеричный для десятичного значения 65, которое является ASCII-кодом для ‘A’. Но я предполагаю, что вы уже знаете это, поскольку вы инициализируете i
до 65 (прописные буквы ASCII и коды VK совпадают).
В любом случае ваш код почти работает нормально, если предположить, что вы пытаетесь регистрировать нажатия клавиш. Короче говоря, ваша задержка цикла слишком велика, чтобы она повторяла каждый символ, который требуется 200ms * 26 = 5.2 seconds
. Поэтому, если вы введете «AAAB» в течение 5,2 секунд, будет зарегистрировано только «AB». Но если задержка слишком короткая, вы можете зарегистрировать нажатие более одного раза.
Прочитайте документацию для GetAsyncKeyState для получения дополнительной информации.
В любом случае я бы, вероятно, выбрал другую функцию, как указано в примечаниях к документации выше, что-то вроде GetKeyboardState, поскольку вы обычно используете что-то вроде GetAsyncKeyState
для регистрации нажатий горячих клавиш или чего-то подобного. ie. GetAsyncKeyState
полезно для того, чтобы узнать, была ли нажата клавиша, а не сколько раз, порядок нажатий и т. Д. Цикл, который у вас есть, кажется действительно подверженным проблемам.
Кроме того, не делайте ничего глупого, регистрируя ключи…
РЕДАКТИРОВАТЬ: на самом деле GetKeyboardState
все еще не настолько хорошее решение. Установка клавиатуры с помощью SetWindowsHookEx была бы гораздо лучшей альтернативой. Вы могли бы использовать WH_KEYBOARD_LL
тип перехвата, чтобы установить перехват клавиатуры низкого уровня с обратным вызовом LowLevelKeyboardProc.
Я немного погуглил, и есть макропрограмма с открытым исходным кодом AutoHotkey, которая использует этот метод, на который, я думаю, вы могли бы взглянуть, если хотите.
Ответ №2:
Взгляните на это.
Использование довольно простое:
unsigned char kbstate[256];
if(!GetKeyboardState(kbstate))
{
// can not get keyboard state
}else{
for(int i=0; i<256: i )
{
if(kbstate[i] amp; 0x1)
{
// the key is pressed, do something
}
}
}