Перейти к содержанию
Fire Monkey от А до Я
  • 0

Глобальные хоткеи в OS X


dnekrasov

Вопрос

Рекомендуемые сообщения

  • 0

Хм... Сам задал вопрос и сам же на него отвечаю...

Нашёл ещё один вариант:

Импортировал несколько методов из Carbon.framework и всё получилось:

uses
  Macapi.CocoaTypes, Macapi.ObjCRuntime, Macapi.CoreFoundation, Macapi.CoreServices;

const
  HITFwk = '/System/Library/Frameworks/Carbon.framework/Frameworks/HIToolbox.framework/HIToolbox';

type 
  EventParamName = OSType;
  EventParamNamePtr = ^EventParamName;
  EventParamType = OSType;
  EventParamTypePtr = ^EventParamType;
  EventRef = ^SInt32; 
  EventRefPtr = ^EventRef;

  EventHotKeyIDPtr = ^EventHotKeyID;
  EventHotKeyID = record
    signature: OSType;
    id: UInt32;
  end;
  EventTypeSpec = record
    eventClass: OSType;
    eventKind: UInt32;
  end;

  EventTypeSpecPtr = ^EventTypeSpec;
  EventTargetRef = ^SInt32; 
  EventHotKeyRef = ^SInt32; 
  OptionBits = UInt32;
  ByteCountPtr = ^ByteCount;

  EventHandlerRef = ^SInt32; 
  EventHandlerRefPtr = ^EventHandlerRef;
  EventHandlerCallRef = ^SInt32; 
  EventHandlerCallRefPtr = ^EventHandlerCallRef;

type
  EventHandlerProcPtr = function(inHandlerCallRef: EventHandlerCallRef; inEvent: EventRef; inUserData: Pointer): OSStatus; cdecl;
  EventHandlerUPP = EventHandlerProcPtr;

const
  kEventHotKeyNoOptions = ;
  kEventHotKeyExclusive = 1 shl ;

  kEventRawKeyDown                = 1;
  kEventRawKeyRepeat              = 2;
  kEventRawKeyUp                  = 3;
  kEventRawKeyModifiersChanged    = 4;
  kEventHotKeyPressed             = 5;
  kEventHotKeyReleased            = 6;

  kEventClassKeyboard: UInt32 = Ord('k') shl 24 + Ord('e') shl 16 + Ord('y') shl 8 + Ord('b');
  typeEventHotKeyID: UInt32 = Ord('h') shl 24 + Ord('k') shl 16 + Ord('i') shl 8 + Ord('d');
  typeWildCard: UInt32 = Ord('*') shl 24 + Ord('*') shl 16 + Ord('*') shl 8 + Ord('*');
  kEventParamDirectObject: UInt32 = Ord('-') shl 24 + Ord('-') shl 16 + Ord('-') shl 8 + Ord('-');

const
  cmdKeyBit = 8;    { command key down?}
  shiftKeyBit = 9;    { shift key down?}
  optionKeyBit = 11;   { option key down?}
  controlKeyBit = 12;   { control key down?}

  cmdKey = 1 shl cmdKeyBit;
  shiftKey = 1 shl shiftKeyBit;
  optionKey = 1 shl optionKeyBit;
  controlKey = 1 shl controlKeyBit;

//    in version 10.0 and later in Carbon.framework
function GetApplicationEventTarget: EventTargetRef; cdecl; external HITFwk name _PU + 'GetApplicationEventTarget';
{$EXTERNALSYM GetApplicationEventTarget}

//         in version 10.0 and later in Carbon.framework
function InstallEventHandler(inTarget: EventTargetRef; inHandler: EventHandlerUPP; inNumTypes: UInt32; {const} inList: {variable-size-array} EventTypeSpecPtr; inUserData: Pointer; outRef: EventHandlerRefPtr { can be NULL } ): OSStatus; cdecl; external HITFwk name _PU + 'InstallEventHandler';
{$EXTERNALSYM InstallEventHandler}

//         in version 10.0 and later in Carbon.framework
function RemoveEventHandler( inHandlerRef: EventHandlerRef ): OSStatus; cdecl; external HITFwk name _PU + 'RemoveEventHandler';
{$EXTERNALSYM RemoveEventHandler}

//         in version 10.0 and later in Carbon.framework
function RegisterEventHotKey(inHotKeyCode: UInt32; inHotKeyModifiers: UInt32; inHotKeyID: EventHotKeyID; inTarget: EventTargetRef; inOptions: OptionBits; var outRef: EventHotKeyRef): OSStatus; cdecl; external HITFwk name _PU + 'RegisterEventHotKey';
{$EXTERNALSYM RegisterEventHotKey}

//         in version 10.0 and later in Carbon.framework
function UnregisterEventHotKey(inHotKey: EventHotKeyRef): OSStatus; cdecl; external HITFwk name _PU + 'UnregisterEventHotKey';
{$EXTERNALSYM UnregisterEventHotKey}

//         in version 10.0 and later in Carbon.framework
function GetEventParameter(inEvent: EventRef; inName: EventParamName; inDesiredType: EventParamType; outActualType: EventParamTypePtr { can be NULL }; inBufferSize: ByteCount; outActualSize: ByteCountPtr { can be NULL }; outData: Pointer { can be NULL } ): OSStatus; cdecl; external HITFwk name _PU + 'GetEventParameter'; 
{$EXTERNALSYM GetEventParameter}

 

Изменено пользователем dnekrasov
Ссылка на комментарий
  • 0

Ещё в AppKit.framework у NSEvent есть такой метод как addGlobalMonitorForEventsMatchingMask. Может кто использовал?

Изменено пользователем dnekrasov
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...