OSX 使用 Lazarus / FreePascal 的键盘事件点击
OSX Keyboard Event Taps with 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 值。也就是说,传递给 CGEventGetIntegerValue() 的 'e' 包含应该在 eType 中的值,即 CGEventType。
另一个是,如果我尝试 return 回调中的事件,它会导致 AV。
所以问题是……我是否正确创建了水龙头(我对 OSX 的内部构造不是很熟悉),如果是这样,fpc 的 OSX 单元是否用于此功能正确的?
Pascal 和 C 有不同 calling conventions。由于您将 KeyboardEventTapCB
传递给将使用 C 调用约定调用它的函数,因此您需要确保它被编译为期望 C 调用约定。
一些网络搜索建议您可以在函数声明的末尾添加cdecl;
。如果不是那样,请尝试用
包围 KeyboardEventTapCB
${CALLING cdecl}
和
${CALLING default}
我正在尝试使用 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 值。也就是说,传递给 CGEventGetIntegerValue() 的 'e' 包含应该在 eType 中的值,即 CGEventType。
另一个是,如果我尝试 return 回调中的事件,它会导致 AV。
所以问题是……我是否正确创建了水龙头(我对 OSX 的内部构造不是很熟悉),如果是这样,fpc 的 OSX 单元是否用于此功能正确的?
Pascal 和 C 有不同 calling conventions。由于您将 KeyboardEventTapCB
传递给将使用 C 调用约定调用它的函数,因此您需要确保它被编译为期望 C 调用约定。
一些网络搜索建议您可以在函数声明的末尾添加cdecl;
。如果不是那样,请尝试用
KeyboardEventTapCB
${CALLING cdecl}
和
${CALLING default}