【问题标题】:GetKeyState in firemonkey火猴中的GetKeyState
【发布时间】:2012-11-21 11:42:56
【问题描述】:

在 VCL (Delphi 2010) 中我使用这个函数来检查是否按下了控制键:

function IsControlKeyPressed: Boolean;
begin
  Result := GetKeyState(VK_CONTROL) < 0;
end;

GetKeyState 是 windows 库中的函数,我不想将它包含到我的项目中。

如何检查 XE3 中是否按下了控制键或 shift 键以进行 firemonkey 应用程序?

【问题讨论】:

  • 看看this post
  • @TLama 谢谢你的链接。此解决方案仅适用于 Mac。我正在寻找独立于平台的解决方案。我会用编译器指令解决这个问题。

标签: delphi keyboard firemonkey delphi-xe3 firemonkey-fm2


【解决方案1】:

如果对其他人有帮助,这是我的单位:

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】:

    请记住在单元uUtils中添加以下内容才能正常工作:

    System.UITypesMacapi.CoreGraphics

    uses
    System.UITypes,
    {$IFDEF MSWINDOWS}
      Winapi.Windows;
    {$ELSE}
      Macapi.AppKit, Macapi.CoreGraphics;
    {$ENDIF}
    

    【讨论】:

      【解决方案3】:

      我已经根据上面的代码扩展了这一点

      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】:

        这是 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;
        

        【讨论】:

          猜你喜欢
          • 2012-02-24
          • 2011-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-07
          • 2018-12-30
          • 1970-01-01
          • 2013-09-22
          相关资源
          最近更新 更多