这甚至可能吗?例如 Notepad++ 就可以做到,但简单地尝试将其分配给操作或菜单项等组件是行不通的。它分配给的事件根本不会触发。
所以,我把我的问题带到了谷歌。纳达。然后,我尝试逐步了解各种快捷功能,在本例中为 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:
编辑2:
手动将 16431 分配给菜单项不起作用。