Delphi监控CapsLock键的状态

Delphi监控CapsLock键的状态,delphi,winapi,Delphi,Winapi,我的程序在后台运行,并使用计时器定期检查Capslock是否打开或关闭 我的问题是,是否存在比使用计时器更好的解决方案 procedure TForm1.Timer2Timer(Sender: TObject); var KeyState: TKeyboardState; begin GetKeyboardState(KeyState) ; if (KeyState[VK_CAPITAL] = 0) then CheckBox1.Checked:=False //Capslock is

我的程序在后台运行,并使用计时器定期检查Capslock是否打开或关闭

我的问题是,是否存在比使用计时器更好的解决方案

procedure TForm1.Timer2Timer(Sender: TObject);
var KeyState: TKeyboardState;
begin
  GetKeyboardState(KeyState) ;
 if (KeyState[VK_CAPITAL] = 0) then
  CheckBox1.Checked:=False //Capslock is OFF
 else
  CheckBox1.Checked:=True; //Capslock is ON
end;

使用低级键盘挂钩,
WH\u-keyboard\u-LL
执行此操作。使用
SetWindowHookEx
安装挂钩。钩子过程中的每个键盘事件都会通知您。通过调用
GetKeyboardState
检测原始状态

请注意,您必须更仔细地阅读文档。对于
GetKeyboardState
它说:

如果该键是切换键,例如CAPS LOCK,则切换该键时低阶位为1,未切换该键时低阶位为0

因此,用零测试整个字节是错误的。只测试低阶位。使用
和$1
选择该位