Delphi:如何检测带有Shift键的键名

时间:2014-05-09 12:08:38

标签: delphi text keyboard shortcut

我有一个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内部例程会这样做,因为=+在英文键盘布局中共享相同的键。

这里的问题是如何知道+的相反键名,无论键盘布局如何?

2 个答案:

答案 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