Проблема с виртуальными кодами кнопок
Пытаюсь разобраться в Virtual key codes, почему то когда я использую виртуальные ключи типа VK_SPACE или там VK_INSERT все работает, но как задаю VK_UP(стрелочки) или VK_NUMPAD0, никакой реакции на нажатие... может дело в том, что я пробую на ноутбуке у него клавиатура немного отличается от стандартной?
Однако,ты уже себе сам и ответил.
Пока.
Однако,ты уже себе сам и ответил.
Пока.
я не уверен что это так, это только предположение...
я не уверен что это так, это только предположение...
Используй GetKeyState(VK_UP) в отдельном потоке. (На худой конец в таймере)
Используй GetKeyState(VK_UP) в отдельном потоке. (На худой конец в таймере)
Немного не тот эффект и не то, вот мой код... я упражняюсь хочу чтобы объект ( в моем случае форма двигалась по экрану в зависимости от нажатых стрелочек ), вот код который работал:
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
//if(Key == 'S')
if(Key == 'S')
Timer1->Enabled=True;
if(Key == 'W')
Timer2->Enabled=True;
if(Key == 'A')
Timer3->Enabled=True;
if(Key == 'D')
Timer4->Enabled=True;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key == 'S')
Timer1->Enabled=False;
if(Key == 'W')
Timer2->Enabled=False;
if(Key == 'A')
Timer3->Enabled=False;
if(Key == 'D')
Timer4->Enabled=False;
}
Я хотел просто чтобы я мог двигать не буквами а стрелочками, при замене if(GetKeyState(VK_UP)) ничего не происходит, т.е. никакой реакции на нажатие стрелочки, а при VK_INSERT (например), объект двигается, но не останавливается, когда я перестаю жать на клавишу.
{
if(GetKeyState(VK_UP)&128)Top-=5;
if(GetKeyState(VK_DOWN)&128)Top+=5;
if(GetKeyState(VK_LEFT)&128)Left-=5;
if(GetKeyState(VK_RIGHT)&128)Left+=5;
}
Вот мой вариант. ЧеМ он тебе не нравиться?
{
if(GetKeyState(VK_UP)&128)Top-=5;
if(GetKeyState(VK_DOWN)&128)Top+=5;
if(GetKeyState(VK_LEFT)&128)Left-=5;
if(GetKeyState(VK_RIGHT)&128)Left+=5;
}
Вот мой вариант. ЧеМ он тебе не нравиться?
Нда, так у меня все пашет, сенкс, интересно, а почему мой не работал... ну да ладно, а вот только зачем 128????
Нда, так у меня все пашет, сенкс, интересно, а почему мой не работал... ну да ладно, а вот только зачем 128????
Потому, что нам надо проверить восьмой бит. Еще можно так написать
Теперь понятнее?=))
Потому, что нам надо проверить восьмой бит. Еще можно так написать
Теперь понятнее?=))
К сожалению не понятнее, но это наверное из за моих скудных ламерских знаний в области программирования, я токо начинаю... ладно, спасибо, попробую найти ченть про GetKeyState, просто я думал, что она возвращает либо 0, либо 1. А оказалось не все так просто...
К сожалению не понятнее, но это наверное из за моих скудных ламерских знаний в области программирования, я токо начинаю... ладно, спасибо, попробую найти ченть про GetKeyState, просто я думал, что она возвращает либо 0, либо 1. А оказалось не все так просто...
Функция возвращает байт (8 бит, с номерами от 0 до 7, где 0 - младший), нам надо узнать значение 7ого бита. AND (&) - логическое И
1 & 0 = 0
0 & 1 = 0
1 & 1 = 1
10111001 & 10000000 ( = 128) = 10000000
00111001 & 10000000 ( = 128) = 00000000
То есть если первый 7ой бит единица, то GetKeyState(VK_UP)&128 будет равно 128, иначе 0. Или (для ифа) true или false.
Операция ">>" есть побитовый сдвиг вправо. (При сдвиге на 1 0вой бит заменяется 1ым, 1ый - вторым, а седьмой становится 0). При сдвиге на 7 вправо 7ой бит становится 0вым, а все оставшиеся - нулями. И опять мы получаем либо true, либо false. Вот.