Как работает GetKeyState? - PullRequest
0 голосов
/ 06 июня 2018

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

Согласно MSDN :

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

Посмотрите на следующий код.Я не создал цикл обработки сообщений.65 представляет виртуальную клавишу символа «A».

        while(true) {

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

Я нажал «A» на клавиатуре, , находясь в окне консоли моей программы .иногда значение 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 не увидит ввод, введенный пользователем в эту другую программу, поскольку этот ввод не был отправлен в вашу очередь ввода.

...