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

delphi – VCL-Styles菜单热键不一致

发布时间:2020-12-15 09:29:44 所属栏目:大数据 来源:网络整理
导读:我注意到,当启用VCL-Styles时,即使没有按下Alt键,也会使用热键选择菜单中的项目. 这会干扰我的其他用户界面,我发现样式库改变了热键的行为很奇怪. 我可以以某种方式消除这种不一致吗? 正常:按“A”不会激活主菜单(Alt A会). 样式:按“A”激活主菜单.注意
我注意到,当启用VCL-Styles时,即使没有按下Alt键,也会使用热键选择菜单中的项目.

这会干扰我的其他用户界面,我发现样式库改变了热键的行为很奇怪.

我可以以某种方式消除这种不一致吗?

正常:按“A”不会激活主菜单(Alt A会).

样式:按“A”激活主菜单.注意:没有Alt键.

我的测试项目是here,以防有人想尝试一下.

解决方法

这个问题似乎与处理消息CM_DIALOGCHAR的TFormStyleHook.CMDialogChar方法有关,原始方法不检查是否按下了Alt键.

我写了这个样式钩子,它解决了这个问题.

type
  TFormStyleHookFix= class (TFormStyleHook)
  procedure CMDialogChar(var Message: TWMKey); message CM_DIALOGCHAR;
  end;

  TFormStyleHookHelper= class  helper for TFormStyleHook
  private
     function CheckHotKeyItem(ACharCode: Word): Boolean;
  end;



{ TFormStyleHookFix }

procedure TFormStyleHookFix.CMDialogChar(var Message: TWMKey);
begin
   if ((Message.KeyData and $20000000) <> 0 ) and (CheckHotKeyItem(Message.CharCode)) then
    begin
      Message.Result := 1;
      Handled := True;
    end
end;

{ TFormStyleHookHelper }
function TFormStyleHookHelper.CheckHotKeyItem(ACharCode: Word): Boolean;
begin
  Result:=False;
  if Self.FMainMenuBarHook<>nil then
   Result:=Self.FMainMenuBarHook.CheckHotKeyItem(ACharCode);
end;

以这种方式使用

TStyleManager.Engine.RegisterStyleHook(TForm9,TFormStyleHookFix);

记得将此案件报告给Quality Central.

(编辑:李大同)

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

    推荐文章
      热点阅读