2015-05-04 2 views
0

Я пытаюсь создать кран клавиатуры 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 для этой функции правильными?

ответ

1

Pascal и C имеют разные calling conventions. Поскольку вы передаете свой KeyboardEventTapCB в функцию, которая будет вызывать ее с помощью соглашений о вызове C, вам нужно убедиться, что она скомпилирована, чтобы ожидать соглашений о вызове C.

Некоторые поисковые запросы в Интернете показывают, что вы можете добавить cdecl; в конце объявления функции. Если не так, попробуйте окружающие KeyboardEventTapCB с:

${CALLING cdecl} 

и

${CALLING default} 
+0

Вы прибил его ... что это было! Я совсем забыл об этом. – GrandmasterB

 Смежные вопросы

  • Нет связанных вопросов^_^