gpt4 book ai didi

delphi - 在Delphi程序中使用Ctrl+/作为快捷键

转载 作者:行者123 更新时间:2023-12-03 14:55:56 25 4
gpt4 key购买 nike

这可能吗?例如,Notepad++ 可以做到这一点,但简单地尝试将其分配给操作或菜单项等组件是行不通的。它分配给的事件根本不会触发。

因此,我向 Google 提出了问题。没什么。然后,我尝试单步执行各种快捷方式功能,在本例中为 TextToShortCut 和 ShortCutToText。

第一个 TextToShortCut 将“Ctrl+A”(字符串)之类的内容转换为以下 16 位值:

(uint)A | (uint)Ctrl

大部分情况下工作正常。然而,我观察到以下奇怪的现象:

// Try converting back and forward...
TextToShortCut('Ctrl+/') = 16495

// That's incorrect. It should be:
Ord('/') or scCtrl = 16431

// Incorrect too
ShortCutToText(16495) = 'Ctrl+/'

// This is the shortcut the first line actually creates (Ctrl+o)
Ord('o') or scCtrl = 16495 // wut?

// Which is invalid, cause only caps are used
ShortCutToText(16431) = ''

这是怎么回事?目前,我认为错误在于 TextToShortCut 的最后部分:处理+号之前的部分(本例中为“Ctrl”)后,它将尝试找到剩余部分(“/”)的快捷方式。 但是,在当前形式中,+ 后面的部分本身也必须是有效的快捷方式。

for Key := $08 to $255 do { Copy range from table in ShortCutToText }
if AnsiCompareText(Text, ShortCutToText(Key)) = 0 then
begin
Result := Key or Shift;
Exit;
end;

所以,因为:

ShortCutToText('/') = 0 (failure)
MapVirtualKey('/',MAPVK_VK_TO_VSC) = 0 (failure)

...循环无法将“/”检测为有效的快捷方式。

这是 VCL 的错误还是我遗漏了什么?

这是一个概念证明(是的,我正在截取代码的屏幕截图,但是将其与 Component Palette 混合在一起比直接使用此代码更快):

编辑1:

enter image description here

编辑2:

手动将 16431 分配给菜单项不起作用。

最佳答案

如果您将 OnShortCut 事件处理程序分配给菜单的父 TForm,您将看到按 Ctrl+/Menus.ShortCutFromMessage() 中得出 TShortCut 值为 16575,这是 VCL 在分派(dispatch)击键进行快捷键处理时在内部使用的函数。

ShortCutToText(16495)ShortCutToText(16575) 都返回 'Ctrl+/',所以让我们分解一下:

scCtrl = $4000
16495 = $406F
16575 = $40BF

两个快捷方式都有 scCtrl 标志。

ShortCutToText($6F)ShortCutToText($BF) 均返回 '/'。这是因为 MapVirtualKey() 为虚拟键 $6F (VK_DIVIDE) 和 $BF 返回相同的扫描代码 ($350000) (VK_OEM_2 - 美国键盘的 /? 键)。

分派(dispatch)快捷方式时,VCL 会对 TShortCut 值进行精确比较。因此,当您将 16495 指定为快捷方式时,它不会触发,因为系统报告的是 16575 的快捷方式,即使它们都映射到 Ctrl+/

当我将 16575 分配给 TMenuItemTActionShortCut 属性时,按 Ctrl+/ 按预期触发该项目。

因此,诀窍在于系统正在报告使用 /VK_OEM_2 虚拟键的快捷方式,但您希望它使用 VK_DIVIDE 改为虚拟键。

关于delphi - 在Delphi程序中使用Ctrl+/作为快捷键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18724107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com