加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 10:09:46 所属栏目:大数据 来源:网络整理
导读:背景: 我正在从TCustomControl类派生出一个可以获得焦点的控件,其中包含一些内部元素.如果用户用光标悬停它们,那么内部元素将被突出显示,您可以选择它们,移动它们等等.现在问题… 问题: 如果用户持有CTRL,ALT或SHIFT修饰符,我正在使用(让我们说)关注的元素
背景:

我正在从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中有一个例子.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读