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