Я пытаюсь создать кран клавиатуры OSX, используя Lazarus/FreePascal. У Lazarus установлены значения по умолчанию из установочного набора - 32bit и Carbon.OSX Keyboard Event Taps with Lazarus/FreePascal
Заходящий кран код выглядит следующим образом:
eventMask := (1 shl kCGEventKeyDown) or (1 shl kCGEventKeyUp);
KeyboardTap := CGEventTapCreate(KCGSessionEventTap, kCGHeadInsertEventTap, 0, eventMask, @KeyboardEventTapCB, nil);
if KeyboardTap <> nil then
begin
RunLoopSource := CFMachPortCreateRunLoopSource(kCFAllocatorDefault, KeyboardTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), RunLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(KeyboardTap, 1);
result := true;
end
И обратный вызов выглядит следующим образом:
function KeyboardEventTapCB(proxy: CGEventTapProxy; eType: CGEventType; e: CGEventRef; userInfo: UnivPtr): CGEventRef;
var
keycode: CGKeyCode;
begin
keycode := CGEventGetIntegerValueField(e, kCGKeyboardEventKeycode);
result := nil;
end;
У меня две проблем.
Первый заключается в том, что CGEventRef, передаваемый в обратный вызов, выглядит как его фактическое значение CGEventType. То есть, 'e', передаваемый в CGEventGetIntegerValue(), содержит значение, которое должно быть в eType, CGEventType.
Другое, что если я попытаюсь вернуть событие в обратном вызове, это вызывает и AV.
Итак, вопрос в том, что я правильно создаю краны (я не очень хорошо знаком с внутренними элементами OSX), и если да, то являются ли операционные системы OSX для этой функции правильными?
Вы прибил его ... что это было! Я совсем забыл об этом. – GrandmasterB