我的程序在后台运行,并使用计时器定期检查 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;

最佳答案

使用低级键盘钩子(Hook) WH_KEYBOARD_LL 执行此操作。使用 SetWindowHookEx 安装钩子(Hook)。您将收到钩子(Hook)过程中每个键盘事件的通知。通过调用 GetKeyboardState 检测原始状态。

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



因此,针对零测试整个字节是错误的。只测试低位。使用 and $1 挑选出那个位。

关于Delphi 监控 CapsLock 键的状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27223601/

10-13 08:07