Использование GetKeyState () - PullRequest
7 голосов
/ 13 июня 2011

Я хотел бы, чтобы при нажатии клавиши происходило переключение логического события.В частности, клавиша 's'.Мне указали на функцию GetKeyState (), которая предположительно работает под Win32 API.Я понимаю, что ASCII-код для буквы 's' равен 115, поэтому мой код выглядит следующим образом:

if (GetKeyState(115) == 1)
{
<EVENT>
}

Однако это не работает.Зачем?Вот ссылка на MSDN: http://msdn.microsoft.com/en-us/library/ms646301%28v=vs.85%29.aspx ... "Если младший бит равен 1, ключ переключается"

Ответы [ 5 ]

15 голосов
/ 13 июня 2011

Из того, что я понимаю, вам нужно сделать:

if( GetKeyState(115) & 0x8000 )
{
    <EVENT>
}

Старший бит сообщает, нажата ли клавиша.Самое низкое говорит о том, переключена ли клавиша (например, включена ли заглавная буква).

6 голосов
/ 09 мая 2016

Поскольку SHORT подписан, старший бит равен знаковому биту.

Поэтому, чтобы проверить, нажата ли данная клавиша, просто проверьте, является ли значение, возвращаемое GetKeyState(), отрицательным:

if (GetKeyState('S') < 0) {
    // The S key is down.
} else {
    // The S key is up.
}

Кроме того, 115 - это код ASCII для 's'.Я полагаю, вам следует использовать заглавную букву 83 для проверки клавиши 'S'.

0 голосов
/ 22 февраля 2019

Иногда вы хотите использовать комбинацию клавиш .

Чтобы избежать ситуаций, когда комбинация клавиш (например, VK_SHIFT && VK_LEFT) удовлетворяет двум условиям:

std::cout << "Shift RIGHT pressed" << std::endl;
std::cout << "LEFT key pressed" << std::endl;

просто используйте Sleep(...); и GetAsyncKeyState(VK_...)

GetKeyState () против GetAsyncKeyState () против getch ()?

#include <windows.h>  

    ...

    while (1)
    {
        if ((GetKeyState(VK_SHIFT) & 0x8000) && (GetAsyncKeyState(VK_LEFT) & 0x8000))
        {
            Sleep(200);
            std::cout << "Shift LEFT pressed" << std::endl;
        }

        if ((GetKeyState(VK_SHIFT) & 0x8000) && (GetAsyncKeyState(VK_RIGHT) & 0x8000))
        {
            Sleep(200);
            std::cout << "Shift RIGHT pressed" << std::endl;
        }

        if (GetAsyncKeyState(VK_RIGHT))
        {
            std::cout << "RIGHT key pressed" << std::endl;
        }

        if (GetAsyncKeyState(VK_LEFT))
        {
            std::cout << "LEFT key pressed" << std::endl;
        }
   }
0 голосов
/ 26 марта 2018

Я использую глобальную переменную bool altgr

Пример:

void Editor::HandleKey(char car) {

    bool shift = false;
    //bool altgr = false;
    bool printable = false;

    if (car == 27) SendMessage(hwnd, WM_DESTROY, 0, 0);

    if ((GetKeyState(VK_CAPITAL) & 0x0001) == 1) shift = true;
    if ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000) shift = true;
    // if(GetKeyState(VK_RMENU) & 0x80000000 == 0x80000000) altgr = true;
    if (car == 18) altgr = true; 
0 голосов
/ 27 октября 2014

Слишком поздно для этого, но старший бит 0x80000000, а не 0x8000, измените его, и он будет работать нормально.

Другой бит - бесполезный - он действует так, как будто вы нажимали CAPS LOCK, когда нажимали LSHIFT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...