WinAPI: как получить состояние Caps Lock?

Как узнать, включен или выключен Caps Lock? Я пытался найти его, но все, что я нашел, это как включить или выключить его, что прямо противоположно тому, что я ищу.

Я пытаюсь сделать это как на С++, так и на Delphi.
Пожалуйста, помогите


person SmRndGuy    schedule 16.12.2012    source источник


Ответы (3)


Вам нужна функция GetKeyState():

http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx

с кодом ключа VK_CAPITAL. Остальные коды виртуальных клавиш находятся здесь:

http://technet.microsoft.com/en-us/subscriptions/index/dd375731(v=vs.85).aspx

person HerrJoebob    schedule 16.12.2012
comment
Разве это не просто получение состояния ключа? Caps Lock обычно используется в качестве переключателя. Это действительно дает вам состояние переключения для всей машины? - person ; 22.12.2014
comment
Да, это действительно дает вам состояние переключения. Это не так интуитивно понятно, что этот метод дает вам нажатия клавиш пользователем, а также общие состояния переключения клавиш. - person Jan Feldmann; 27.08.2016
comment
Состояние ключа, возвращаемое этой функцией, изменяется по мере того, как поток считывает ключевые сообщения из своей очереди сообщений. Состояние не отражает состояние уровня прерывания, связанного с оборудованием. Используйте функцию GetAsyncKeyState для получения этой информации. -- MSDN - person Orwellophile; 11.01.2017

Я нашел эту ссылку и фрагмент кода ниже, который может вам помочь

if ((GetKeyState(VK_CAPITAL) & 0x0001)!=0)
  AfxMessageBox("Caps Lock ON!");
else
  AfxMessageBox("Caps Lock OFF!");
person Mattias Josefsson    schedule 16.12.2012
comment
Также работает с VK_SCROLL для Scroll Lock и VK_NUMLOCK для Num Lock. - person Jan Feldmann; 27.08.2016
comment
Важной частью этого является & 0x0001, потому что информация возвращается в младшем бите. - person wrecks; 23.01.2021

Используйте GetAsyncKeyState с VK_CAPITAL (0x14)

person Bernd Elkemann    schedule 16.12.2012
comment
Если функция завершается успешно, возвращаемое значение указывает, была ли клавиша нажата с момента последнего вызова GetAsyncKeyState, и находится ли клавиша в данный момент нажатой или нажатой. Если установлен старший бит, клавиша нажата, а если установлен младший бит, клавиша была нажата после предыдущего вызова GetAsyncKeyState. Однако вам не следует полагаться на это последнее поведение; для получения дополнительной информации см. Примечания. - person Orwellophile; 11.01.2017