delphi - GetKeyState en firemonkey
keyboard delphi-xe3 (4)
Si ayuda a alguien más, esta es mi unidad:
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.
En VCL (Delphi 2010) utilicé esta función para verificar si se presiona la tecla de control:
function IsControlKeyPressed: Boolean;
begin
Result := GetKeyState(VK_CONTROL) < 0;
end;
GetKeyState es una función en la biblioteca de Windows que no quiero incluir en mi proyecto.
¿Cómo puedo verificar si se presiona el control o la tecla Mayús en XE3 para la aplicación firemonkey?
He ampliado esto en función de la comprobación de código anterior si alguna tecla está desactivada según el vkKeyCode (y algunas traducciones para 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;
aquí está el texto del archivo 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;
Recuerde agregar lo siguiente en la unidad uUtils para que funcione correctamente:
System.UITypes
y Macapi.CoreGraphics
.
uses
System.UITypes,
{$IFDEF MSWINDOWS}
Winapi.Windows;
{$ELSE}
Macapi.AppKit, Macapi.CoreGraphics;
{$ENDIF}