我的程序在后台运行,并使用计时器定期检查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;发布于 2014-12-01 07:42:06
用一个低级别的键盘钩子( WH_KEYBOARD_LL )来做这件事。用SetWindowHookEx安装钩子。您将收到钩子程序中每个键盘事件的通知。通过调用GetKeyboardState来检测原始状态。
请注意,您必须更仔细地阅读文档。对于GetKeyboardState,它说:
如果键是一个切换键,例如大写锁,那么当键被切换时,低阶位是1,如果键是未切换的,则为0。
因此,对零测试整个字节是错误的。只测试低阶位。使用and $1来选择该位。
发布于 2022-06-06 13:48:04
KeyPreview:=真
FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if GetKeyState(VK_CAPITAL) > 0 then
hdrSts.Sections[0]:= 'CAPS LOCK'
else
hdrSts.Sections[0]:= '';
end;https://stackoverflow.com/questions/27223601
复制相似问题