OSX键盘事件与Lazarus / FreePascal一起使用

时间:2015-05-04 21:30:36

标签: macos lazarus freepascal

我尝试使用Lazarus / FreePascal创建OSX键盘事件。 Lazarus设置为默认设置 - 32位和Carbon小部件集。

设置点按的代码如下:

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值。也就是说,&#39; e&#39;被传递到CGEventGetIntegerValue()中的值应该是eType中的值,即CGEventType。

另一个是如果我尝试在回调中返回事件,则会导致AV。

所以问题是......我是否正确创建了水龙头(我对OSX的内部结构并不十分熟悉),如果是这样,那么这个功能的fpc OSX单元是否正确?

1 个答案:

答案 0 :(得分:1)

Pascal和C有不同的calling conventions。由于您将KeyboardEventTapCB传递给将使用C调用约定调用它的函数,因此您需要确保将其编译为期望C调用约定。

某些网络搜索建议您可以在函数声明的末尾添加cdecl;。如果不是这样,请尝试围绕KeyboardEventTapCB

${CALLING cdecl}

${CALLING default}