Создаю глобальный hook на несколько событий:
{$IFDEF MACOS}
var
EvtTap: CFMachPortRef;
RunLoopSource: CFRunLoopSourceRef;
{$ENDIF}
...
procedure CreateGlobalHook;
{$IFDEF MACOS}
var
EvtMask: UInt64;
{$ENDIF}
begin
{$IFDEF MACOS}
if EvtTap = nil then
begin
EvtMask := (1 shl kCGEventKeyDown) or (1 shl kCGEventFlagsChanged) or (1 shl kCGEventLeftMouseUp);
EvtTap := CGEventTapCreate(kCGAnnotatedSessionEventTap, kCGTailAppendEventTap, kCGEventTapOptionListenOnly,
EvtMask, @EventTapHandler, nil);
RunLoopSource := CFMachPortCreateRunLoopSource(kCFAllocatorDefault, EvtTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent, RunLoopSource, kCFRunLoopCommonModes);
end;
CGEventTapEnable(EvtTap, 1);
{$ENDIF}
end;
function EventTapHandler(proxy: CGEventTapProxy; type_: CGEventType; event: CGEventRef; refcon: Pointer): CGEventRef; cdecl;
{$IFDEF MACOS}
var
iKey: Integer;
iType: Integer;
{$ENDIF}
begin
{$IFDEF MACOS}
Result := event;
iType := CGEventGetType(event);
iKey := CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
case iType of
kCGEventFlagsChanged: ...;
kCGEventLeftMouseUp: ...;
kCGEventKeyDown: ...;
end;
{$ENDIF}
end;
При обработке события возникает проблема: приходят все события кроме kCGEventKeyDown
В документации нашел, что kCGEventKeyDown и kCGEventKeyUp приходят только в том случае если приложение запущено от root-а или внесено в список "System Preferences->Security & Privacy->Privacy->Accessibility"
Может кто знает как мне программно получить доступ к этим событиям?