我的程序在后台运行,并使用计时器定期检查Capslock是ON还是OFF。
我的问题是,是否存在比使用计时器更好的解决方案?
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;
答案 0 :(得分:6)
使用低级键盘钩WH_KEYBOARD_LL
执行此操作。使用SetWindowHookEx
安装挂钩。您将收到hook proc中每个键盘事件的通知。通过调用GetKeyboardState
来检测原始状态。
请注意,您必须仔细阅读文档。对于GetKeyboardState
,它说:
如果该键是切换键,例如CAPS LOCK,则当切换键时低位为1,如果键未被去除则为0。
因此,将整个字节测试为零是错误的。只测试低位。使用and $1
来挑选该位。