在 VCL (Delphi 2010) 中,我使用这个函数来检查是否按下了控制键:
function IsControlKeyPressed: Boolean;
begin
Result := GetKeyState(VK_CONTROL) < 0;
end;
GetKeyState 是 Windows 库中的函数,我不想将它包含到我的项目中。
如何检查是否在 XE3 中为 firemonkey 应用程序按下了 control 或 shift 键?
在 VCL (Delphi 2010) 中,我使用这个函数来检查是否按下了控制键:
function IsControlKeyPressed: Boolean;
begin
Result := GetKeyState(VK_CONTROL) < 0;
end;
GetKeyState 是 Windows 库中的函数,我不想将它包含到我的项目中。
如何检查是否在 XE3 中为 firemonkey 应用程序按下了 control 或 shift 键?
如果它对其他人有帮助,这是我的单位:
unit uUtils;
interface
uses
{$IFDEF MSWINDOWS}
Winapi.Windows;
{$ELSE}
Macapi.AppKit;
{$ENDIF}
function IsControlKeyPressed: Boolean;
function IsShiftKeyPressed: Boolean;
implementation
function IsControlKeyPressed: Boolean;
begin
{$IFDEF MSWINDOWS}
Result := GetKeyState(VK_CONTROL) < 0;
{$ELSE}
Result := NSControlKeyMask and TNSEvent.OCClass.modifierFlags = NSControlKeyMask;
{$ENDIF}
end;
function IsShiftKeyPressed: Boolean;
begin
{$IFDEF MSWINDOWS}
Result := GetKeyState(VK_SHIFT) < 0;
{$ELSE}
Result := NSShiftKeyMask and TNSEvent.OCClass.modifierFlags = NSShiftKeyMask;
{$ENDIF}
end;
end.
请记住在单元uUtils中添加以下内容才能正常工作:
System.UITypes
和 Macapi.CoreGraphics
。
uses
System.UITypes,
{$IFDEF MSWINDOWS}
Winapi.Windows;
{$ELSE}
Macapi.AppKit, Macapi.CoreGraphics;
{$ENDIF}
我已经根据上面的代码扩展了这个,检查是否有任何键基于 vkKeyCode (以及 Mac 的一些翻译)
function KeyIsDown(KeyInQuestion:Integer):Boolean;
begin
{$IFDEF MSWINDOWS}
result:=GetAsyncKeyState(KeyInQuestion) AND $FF00 <> 0;
{$ENDIF MSWINDOWS}
{$IFDEF MACOS}
{$INCLUDE WinVKeyToMacVKey.Inc}
case KeyInQuestion of
vkLButton: result:= Macapi.AppKit.TNSEvent.OCClass.pressedMouseButtons = 1;
vkRButton: result:= Macapi.AppKit.TNSEvent.OCClass.pressedMouseButtons = (1 SHL 1);
vkMButton: result:= Macapi.AppKit.TNSEvent.OCClass.pressedMouseButtons = (1 SHL 2);
else
result:=(CGEventSourceKeyState(0, KeyInQuestion) <> 0);
end;
{$ENDIF MACOS}
//This is so it's not left/right-centric vkShift will return true
//if either vkShift or vkRShift is down
if not result then
case KeyInQuestion of
vkShift:result:=KeyIsDown(vkRShift);
vkControl:result:=KeyIsDown(vkRControl);
vkMenu:result:=KeyIsDown(vkRMenu);
end;
end;
这是 WinVKeyToMacVKey.Inc 文件的文本
case KeyInQuestion of
vkReturn: KeyInQuestion := $24;
vkTab: KeyInQuestion := $30;
vkSpace: KeyInQuestion := $31;
vkBack: KeyInQuestion := $33;
vkEscape: KeyInQuestion := $35;
vkLWin: KeyInQuestion := $37;
vkRWin: KeyInQuestion := $37;
vkShift: KeyInQuestion := $38;
vkMenu: KeyInQuestion := $3A;
vkControl: KeyInQuestion := $3B;
vkRShift: KeyInQuestion := $3C;
vkRMenu: KeyInQuestion := $3D;
vkRControl: KeyInQuestion := $3E;
vkF17: KeyInQuestion := $40;
vkVolumeUp: KeyInQuestion := $48;
vkVolumeDown: KeyInQuestion := $49;
vkF18: KeyInQuestion := $4F;
vkF19: KeyInQuestion := $50;
vkF20: KeyInQuestion := $5A;
vkF5: KeyInQuestion := $60;
vkF6: KeyInQuestion := $61;
vkF7: KeyInQuestion := $62;
vkF3: KeyInQuestion := $63;
vkF8: KeyInQuestion := $64;
vkF9: KeyInQuestion := $65;
vkF11: KeyInQuestion := $67;
vkF13: KeyInQuestion := $69;
vkF16: KeyInQuestion := $6A;
vkF14: KeyInQuestion := $6B;
vkF10: KeyInQuestion := $6D;
vkF12: KeyInQuestion := $6F;
vkF15: KeyInQuestion := $71;
vkHelp: KeyInQuestion := $72;
vkHome: KeyInQuestion := $73;
vkPrior: KeyInQuestion := $74;
vkDelete: KeyInQuestion := $75;
vkF4: KeyInQuestion := $76;
vkEnd: KeyInQuestion := $77;
vkF2: KeyInQuestion := $78;
vkNext: KeyInQuestion := $79;
vkF1: KeyInQuestion := $7A;
vkLeft: KeyInQuestion := $7B;
vkRight: KeyInQuestion := $7C;
vkDown: KeyInQuestion := $7D;
vkUp: KeyInQuestion := $7E;
end;