问题
In VCL (Delphi 2010) I used this function to check whether control key is pressed:
function IsControlKeyPressed: Boolean;
begin
Result := GetKeyState(VK_CONTROL) < 0;
end;
GetKeyState is function in windows library that I do not want to include it into my project.
How can I check if control or shift key is pressed in XE3 for firemonkey application?
回答1:
If it helps for anyone else, this is my unit:
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.
回答2:
Please remember to add the following in unit uUtils to work properly:
System.UITypes
and Macapi.CoreGraphics
.
uses
System.UITypes,
{$IFDEF MSWINDOWS}
Winapi.Windows;
{$ELSE}
Macapi.AppKit, Macapi.CoreGraphics;
{$ENDIF}
回答3:
I've extended this based on the above code check if any key is down based on the vkKeyCode (and some translations for 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;
回答4:
here is the text of the WinVKeyToMacVKey.Inc file
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;
来源:https://stackoverflow.com/questions/13492531/getkeystate-in-firemonkey