背景:
我正在研究一个从TCustomControl
类派生的控件,它可以获得焦点并且内部有一些内部元素。如果用户将光标悬停在这些内部元素上,它们就会突出显示,您可以选择它们、移动它们等等。现在问题...
问题:
如果用户持有或修饰符CTRL,我将使用(假设)聚焦元素执行不同的操作。如果用户悬停元素并按住例如键,我想要更改鼠标光标。很简单,你只需覆盖and方法并检查它们的参数是否等于. 在这样的代码中:ALTSHIFTCTRLKeyDown
KeyUp
Key
VK_CONTROL
procedure TMyCustomControl.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited;
if Key = VK_CONTROL then
Screen.Cursor := crSizeAll;
end;
procedure TMyCustomControl.KeyUp(var Key: Word; Shift: TShiftState);
begin
inherited;
if Key = VK_CONTROL then
Screen.Cursor := crDefault;
end;
即使这不是检查CTRL键是否被按下和释放的最佳方法(例如,由于现有的Shift
状态参数),它也可以在控件具有焦点时按预期工作,甚至可以得到,但是......
我的目标是在用户悬停控件(或者更准确地说,是其中的某个元素)时更改鼠标光标并保持例如该CTRL键,即使我的控件没有焦点。可以说,所以只需覆盖该MouseMove
方法并在那里请求修饰符状态。这将是一种方式,但是......
如果用户将鼠标光标停留在我的控件上并按下并释放该CTRL键怎么办?这不会为我的控件生成任何鼠标移动或按键事件,还是我错了?嗯,所以我的问题很明显......
问题:
如果控件没有焦点并且用户没有用鼠标移动,我如何检测修饰键更改?我正在考虑这两个选项,但我希望我错过了一些东西:
- 键盘挂钩 - 可靠,但对我来说看起来有点矫枉过正
- 使用计时器定期检查修改器状态 - 我不能忍受延迟
那么,您将如何检测当前未聚焦的控件的修饰键更改?