微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

delphi – 如何检测没有焦点的控件中的修改键更改?

背景:

我正在从TCustomControl类派生出一个可以获得焦点的控件,其中包含一些内部元素.如果用户用光标悬停它们,那么内部元素将被突出显示,您可以选择它们,移动它们等等.现在问题…

问题:

如果用户持有CTRL,ALT或SHIFT修饰符,我正在使用(让我们说)关注的元素做不同的动作.我想要的是更改鼠标光标,如果用户悬停元素并保持为CTRL键.很简单,您只需覆盖KeyDown和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键怎么办?这不会为我的控制生成任何鼠标移动或按键事件,还是我错了?那么我的问题很明显

题:

如果控件没有焦点,用户不能用鼠标移动,我如何检测修改键更改?我在想这两个选项,但我希望有一些我错过的东西:

>键盘挂钩 – 可靠,但对我来说看起来相当吃惊
>定期检查修饰语状态 – 我不能忍受延迟

那么,您如何检测目前尚未关注的控件的修改键更改?

解决方法

我将为 WM_SETCURSOR消息编写一个消息处理程序来调用 GetKeyboardState获取键盘状态(在Delphi中,您可以调用 KeyboardStateToShiftState),并根据其结果(和命中测试)调用 SetCursor使用适当的光标.

为了处理WM_SETCURSOR,在网格单元中的VCL:TCustomGrid.WMSetCursor中有一个例子.

原文地址:https://www.jb51.cc/delphi/102705.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐