GetAsyncKeyState из windows.h - PullRequest
       2

GetAsyncKeyState из windows.h

0 голосов
/ 24 апреля 2018

Я буду использовать следующий код для объяснения моего вопроса:

#include <Windows.h>
#include <iostream>

int main()
{
    bool toggle = 0;
    while (1)
    {
        if (GetAsyncKeyState('C') & 0x8000)
        {
            toggle = !toggle;
            if (toggle) std::cout << "Pressed\n";
            else std::cout << "Not pressed\n";
        }
    }
}

Тестируя, я вижу, что

(GetAsyncKeyState('C') & 0x8000) // 0x8000 to see if the most significant bit is 1

ведет себя так же, как

(GetAsyncKeyState('C'))

Однако, чтобы добиться нужного мне поведения, - так работает любой ввод текста (он ждет около 1 секунды, а если вы все еще нажимаете кнопку, он начинает рассылать спам с определенной скоростью), мне нужно написать

(GetAsyncKeyState('C') & 1)

Документация говорит

Поведение младшего значащего бита возвращаемого значения сохраняется строго для совместимости с 16-битными приложениями Windows (которыене являются приоритетными) и на них нельзя полагаться.

Может кто-нибудь уточнить это, пожалуйста?

1 Ответ

0 голосов
/ 24 апреля 2018

MSDN сообщает, почему на той же странице, на которую вы ссылались!

Хотя младший значащий бит возвращаемого значения указывает, была ли нажата клавиша с момента последнего запроса, из-за преимущественной многозадачности Windows, другое приложение может вызвать GetAsyncKeyState и получить «недавно нажатый» бит вместо вашего приложения . Поведение младшего значащего бита возвращаемого значения сохраняется строго для совместимости с 16-разрядными приложениями Windows (которые не являются приоритетными) и на него не следует полагаться.

GetAsyncKeyState дает вам «состояние уровня прерывания, связанное с оборудованием» и, вероятно, совместно используется всеми процессами в оконной станции / сеансе.

Младший бит может быть связан с задержкой повторения нажатия клавиши клавиатуры, которую вы можете установить на панели управления, но это не имеет большого значения, потому что MSDN говорит вам не смотреть на этот бит.

GetAsyncKeyState обычно не является правильным способом обработки ввода с клавиатуры. Консольные приложения должны читать stdin или использовать консольный API. Приложения с графическим интерфейсом должны использовать сообщения окна WM_CHAR / WM_KEYDOWN / WM_KEYUP.

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