我有一个vclfix project来使Delphi应用程序更具Windows原生外观。我的一个修复是更改菜单项的特定快捷方式文本。
具体来说,如果我将Ctrl++
分配给菜单项"放大",修复程序会将快捷方式文本更改为Ctrl +
。
function ShortCutToTextOverride(ShortCut: TShortCut): string;
(**
* This function replaces the following shortcuts
* "Ctrl++" -> "Ctrl +" | "Ctrl+-" -> "Ctrl -"
* "Shift++" -> "Shift +" | "Shift+-" -> "Shift -"
* "Alt++" -> "Alt +" | "Alt+-" -> "Alt -"
*)
begin
Result := OrigShortCutToText(ShortCut);
case LoByte(Word(ShortCut)) of
VK_OEM_PLUS, VK_ADD:
Result := ReplaceStr(Result, '++', ' +');
VK_OEM_MINUS, VK_SUBTRACT:
Result := ReplaceStr(Result, '+-', ' -');
end;
end;
现在我遇到了一个问题:当我将Ctrl++
分配给菜单项时,它看起来很棒。但不知何故,快捷方式可能会自动更改为Ctrl+=
。也许有些Delphi内部例程会这样做,因为=
和+
在英文键盘布局中共享相同的键。
这里的问题是如何知道+
的相反键名,无论键盘布局如何?
答案 0 :(得分:0)
将其链接到ctrl + shift +'+'
快捷方式仅与美国标准键盘上的未移位键相关联。
显然,如果你想用一个专用的'='键在keuboard上捕获ctrl +'=',那么你必须让mainform捕获所有的keystokes。
使用TForm.KeyPreview:= True
然后向表单添加一个OnKeyPress处理程序。
答案 1 :(得分:0)
这只是一个清除你的想法的例子:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) then
case Key of
107: ShowMessage('Ctrl +');
109: ShowMessage('Ctrl -');
end;
if (ssAlt in Shift) then
case Key of
107: ShowMessage('Alt +');
109: ShowMessage('Alt -');
end;
if (ssShift in Shift) then
case Key of
107: ShowMessage('Shift +');
109: ShowMessage('Shift -');
end;
end;
请记住在表单中设置 True 属性 KeyPreview 。