【发布时间】:2013-09-10 16:18:44
【问题描述】:
这甚至可能吗?例如 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 错误还是我遗漏了什么?
这是一个概念证明(是的,我正在截取代码,但将其与组件面板混合在一起比直接使用此代码要快):
编辑 1:
编辑 2:
手动将 16431 分配给菜单项不起作用。
【问题讨论】:
-
在这里工作正常。尽管仅在作为数字键盘一部分的
/键上。但这就是 npp 所做的。它的恢复缩放快捷方式映射到Ctrl+Num / -
Notepad++ 使用常规的(美国国际上的 Shift 左侧)也用于跳到插入符号处的单词开头。