Как работает GetKeyState?

Я боролся с пониманием, как работает GetKeyState. Я провел бесконечный поиск в Google и пока не смог точно понять, как он работает.

По данным MSDN:

Статус ключа, возвращаемый этой функцией, изменяется, когда поток читает сообщения ключа из своей очереди сообщений.

Посмотрите на следующий код. Я не создал цикл обработки сообщений. 65 представляет виртуальный ключ символа "А".

        while(true) {

            printf("the character %c, the vkey_state is %x", 
            MapVirtualKey(65, MAPVK_VK_TO_CHAR),GetKeyState(65) & 0x8000);
            Sleep(150);
        }

Я нажал "А" на клавиатуре, находясь в окне консоли моей программы. иногда значение vkey_state составляет 0x8000, как и ожидалось, иногда нет.

Что именно происходит под капотом? Я не писал никакого кода обработки сообщений, поэтому я предполагаю, что он создается автоматически. Когда я нажимаю "A", WM_KEYDOWN отправляется в мою цепочку сообщений. Когда я отпускаю ключ "A", WM_KEYUP отправляется в мою очередь сообщений потока. другие связанные с ключом сообщения могут быть отправлены между ними. Что происходит, когда я вызываю GetKeyState? когда именно он установит MSB своего возвращаемого значения в "1"? Когда он снова изменится на 0? Это связано с вызовами в GetMessage?

Кроме того, что меня больше всего смутило, так это то, что когда я переключился на другую программу (cmd.exe) и набрал "A", моя программа смогла контролировать его, находясь в фоновом режиме, - но в потоке cmd.exe появляется другое сообщение. очередь - почему это работает? Однако - это не сработало, если я запустил cmd.exe в режиме повышенных прав (высокая целостность).

это противоречит информации, которую я нашел здесь: https://blogs.msdn.microsoft.com/oldnewthing/20041130-00/?p=37173

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

0 ответов

Другие вопросы по тегам