Orw*_*ell 6 delphi shortcut delphi-7
这甚至可能吗?例如,Notepad ++可以实现,但只是尝试将其分配给操作或菜单项等组件不起作用.它被分配的事件根本不会触发.
所以,我把我的问题提交给谷歌.纳达.然后,我尝试逐步执行各种快捷方式功能,在本例中为TextToShortCut和ShortCutToText.
第一个,TextToShortCut,将"Ctrl + A"(字符串)等内容转换为以下16位值:
(uint)A | (uint)Ctrl
Run Code Online (Sandbox Code Playgroud)
大多数工作正常.但是,我观察到以下奇怪之处:
// 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) = ''
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?现在,我认为错误在于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;
Run Code Online (Sandbox Code Playgroud)
所以,因为:
ShortCutToText('/') = 0 (failure)
MapVirtualKey('/',MAPVK_VK_TO_VSC) = 0 (failure)
Run Code Online (Sandbox Code Playgroud)
...循环无法将'/'检测为有效的快捷方式.
这是一些VCL错误还是我错过了什么?
这是一个概念证明(是的,我正在拍摄代码的截图,但是将它与Component Palette混合在一起比直接使用此代码更快):
编辑1:

编辑2:
手动将16431分配给菜单项不起作用.
Rem*_*eau 12
如果OnShortCut为菜单的父级分配一个事件处理程序TForm,您将看到按Ctrl+ /结果的TShortCut值为16575 Menus.ShortCutFromMessage(),这是VCL在调度快捷键处理时的内部函数.
无论ShortCutToText(16495)和ShortCutToText(16575)回报'Ctrl+/',所以让我们把它分解:
scCtrl = $4000
16495 = $406F
16575 = $40BF
Run Code Online (Sandbox Code Playgroud)
这两个快捷方式都有scCtrl标志.
ShortCutToText($6F)和ShortCutToText($BF)都返回'/'.这是因为MapVirtualKey()为两个虚拟键$6F(VK_DIVIDE)和$BF(VK_OEM_2- /?美国键盘的键)返回相同的扫描码($ 350000 ).
调度快捷方式时,VCL会对TShortCut值进行精确比较.因此,当您将16495指定为快捷方式时,它将不会触发,因为系统正在报告16575的快捷方式,即使它们都映射到Ctrl+/.
当我给你16575在ShortCut一个财产TMenuItem或者TAction,按下Ctrl+ /触发项目,符合市场预期.
因此,诀窍在于系统正在报告使用VK_OEM_2虚拟密钥的快捷方式/,但您希望它使用VK_DIVIDE虚拟密钥.
Key从OnKeyDown事件处理程序进行的简单调查显示了两种不同类型的正斜杠:
/在数字键盘上= 111(与CTRL= 结合16575)/shift键旁边= 191(与CTRL= 结合16495)无法创建响应两者的单个快捷方式.
但是,您可以附加具有SecondaryShortCuts属性的操作,而不是在memu项目上设置快捷方式.然后使用:
procedure TForm1.FormCreate(Sender: TObject);
begin
Action1.ShortCut := 16575;
Action1.SecondaryShortCuts.Add('Ctrl+/');
end;
Run Code Online (Sandbox Code Playgroud)