0

我将TApplicationEvents.OnShortCutDelphi 11 Alexandria 中的事件与 Windows 10 中的 Delphi VCL 应用程序一起使用,例如:

procedure TformMain.ApplicationEvents1ShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  CodeSite.Send('TformMain.ApplicationEvents1ShortCut: Msg.CharCode', Msg.CharCode);
end;

不幸的是,这个事件甚至在没有按下修饰键时触发,例如单独的“V”键或“B”键。当没有按下修饰键时如何退出此事件处理程序,例如:

procedure TformMain.ApplicationEvents1ShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  if NoModifierKeyPressed then EXIT;
  ...
end;
4

2 回答 2

2

您可以使用单元 Winapi.Windows 中的 GetKeyState 函数,以及 VK_CONTROL 或 VK_SHIFT 等虚拟键代码。例如:

procedure TformMain.ApplicationEvents1ShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  if (Msg.CharCode = Ord('V')) and (GetKeyState(VK_CONTROL) < 0) then
    ShowMessage('Ctrl+V was pressed');
end;
于 2021-11-09T12:20:13.963 回答
1

考虑到@RemyLebeau 和@Andreas Rejbrand 的友好评论:

这对我有用:

function NoModifierKeyPressed: Boolean;
var
  keys: TKeyboardState;
begin
  GetKeyboardState(keys);
  Result := (keys[VK_SHIFT] and $80 = 0) and (keys[VK_CONTROL] and $80 = 0) and (keys[VK_MENU] and $80 = 0);
end;
于 2021-11-09T17:32:57.050 回答