Macos 如何使用OSX上的FireMonkey获取当前修改器状态?

Macos 如何使用OSX上的FireMonkey获取当前修改器状态?,macos,delphi,delphi-xe2,firemonkey,keyevent,Macos,Delphi,Delphi Xe2,Firemonkey,Keyevent,对于Windows的Delphi,我通常使用以下代码: function isCtrlDown : Boolean; var ksCurrent : TKeyboardState; begin GetKeyboardState(ksCurrent); Result := ((ksCurrent[VK_CONTROL] and 128) <> 0); end; 我还在调查。。。 现在,我发现这个单元有关键事件东西。。。 unitmacapi.AppKit基于此,您可以尝试

对于Windows的Delphi,我通常使用以下代码:

function isCtrlDown : Boolean;
var
  ksCurrent : TKeyboardState;
begin
  GetKeyboardState(ksCurrent);
  Result := ((ksCurrent[VK_CONTROL] and 128) <> 0);
end;
我还在调查。。。 现在,我发现这个单元有关键事件东西。。。
unitmacapi.AppKit

基于此,您可以尝试以下方法:

function isCtrlDown : Boolean; 
begin
    Result := NSControlKeyMask and TNSEvent.OCClass.modifierFlags = NSControlKeyMask;
end;

这将返回当前的换档状态:

uses
  Macapi.CoreGraphics;

function KeyboardModifiers: TShiftState;
const
  kVK_Shift                     = $38;
  kVK_RightShift                = $3C;
  kVK_Control                   = $3B;
  kVK_Command                   = $37;
  kVK_Option                    = $3A;
begin
  result := [];
  if (CGEventSourceKeyState(0, kVK_Shift) <> 0) or (CGEventSourceKeyState(0, kVK_RightShift) <> 0) then Include(result, ssShift);
  if CGEventSourceKeyState(0, kVK_Command) <> 0 then Include(result, ssCommand);
  if CGEventSourceKeyState(0, kVK_Option) <> 0 then Include(result, ssAlt);
  if CGEventSourceKeyState(0, kVK_Control) <> 0 then Include(result, ssCtrl);
end;
使用
Macapi.coreprographics;
功能键盘修改器:tshift状态;
常数
kVK_班次=38美元;
kVK_RightShift=$3C;
kVK_控制=30亿美元;
kVK_命令=37美元;
kVK_选项=3A美元;
开始
结果:=[];
如果(CGEventSourceKeyState(0,kVK_-Shift)0)或(CGEventSourceKeyState(0,kVK_-RightShift)0),则包括(result,ssShift);
如果CGEventSourceKeyState(0,kVK_命令)0,则包括(result,ssCommand);
如果CGEventSourceKeyState(0,kVK_选项)0,则包括(结果,ssAlt);
如果CGEventSourceKeyState(0,kVK_控制)0,则包括(结果,ssCtrl);
结束;

我睡觉时发布的两种解决方案都有效。对不起,我已经接受了另一个,因为它是在几分钟前发布的。。。很难在你们两人之间做出选择。顺便说一句,你会得到一个+1汉克斯惠勒,我也会给你+1汉克斯惠勒
uses
  Macapi.CoreGraphics;

function KeyboardModifiers: TShiftState;
const
  kVK_Shift                     = $38;
  kVK_RightShift                = $3C;
  kVK_Control                   = $3B;
  kVK_Command                   = $37;
  kVK_Option                    = $3A;
begin
  result := [];
  if (CGEventSourceKeyState(0, kVK_Shift) <> 0) or (CGEventSourceKeyState(0, kVK_RightShift) <> 0) then Include(result, ssShift);
  if CGEventSourceKeyState(0, kVK_Command) <> 0 then Include(result, ssCommand);
  if CGEventSourceKeyState(0, kVK_Option) <> 0 then Include(result, ssAlt);
  if CGEventSourceKeyState(0, kVK_Control) <> 0 then Include(result, ssCtrl);
end;