我的程序在后台运行,并使用计时器定期检查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;
David Heffer.. 6
用低级键盘钩子做到这一点WH_KEYBOARD_LL
.安装挂钩SetWindowHookEx
.您将收到hook proc中每个键盘事件的通知.通过调用检测原始状态GetKeyboardState
.
请注意,您必须更仔细地阅读文档.因为GetKeyboardState
它说:
如果键是切换键,例如CAPS LOCK,那么当切换键时低位为1,如果键未被去除则为0.
因此,将整个字节测试为零是错误的.只测试低位.使用and $1
以挑选出位.
用低级键盘钩子做到这一点WH_KEYBOARD_LL
.安装挂钩SetWindowHookEx
.您将收到hook proc中每个键盘事件的通知.通过调用检测原始状态GetKeyboardState
.
请注意,您必须更仔细地阅读文档.因为GetKeyboardState
它说:
如果键是切换键,例如CAPS LOCK,那么当切换键时低位为1,如果键未被去除则为0.
因此,将整个字节测试为零是错误的.只测试低位.使用and $1
以挑选出位.