gpt4 book ai didi

macos - Mavericks+ 中的 CGEventTapCreateForPSN(已弃用 GetCurrentProcess)

转载 作者:行者123 更新时间:2023-12-03 16:02:45 25 4
gpt4 key购买 nike

我正在使用 CGEventTapCreateForPSN 来捕获和过滤我的应用程序的 key 。我对拦截其他应用程序的事件不感兴趣。我很确定事件点击对于我的目的来说太过严厉,但我一直无法找到更好的方法,并且使用事件点击是有效的。

具体来说,这段代码实现了我想要的功能。

GetCurrentProcess(&psn);
CFMachPortRef eventTap = CGEventTapCreateForPSN(
&psn,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit(kCGEventKeyDown)
| CGEventMaskBit(kCGEventKeyUp),
eventCallback,
userInfo);

我的回调处理得很好,事件仅从当前应用程序拦截。

不幸的是,从 10.9 开始,所有获取当前 ProcessSerialNumber 的方法均已弃用。有一种旧的标准方法可以通过此初始化将 ProcessSerialNumber 传递给同一进程中的其他例程...

ProcessSerialNumber psn = { 0, kCurrentProcess };

但是在调用CGEventTapCreateForPSN时这不起作用。头文件文档表明了这一点,以下代码片段返回 NULL 作为确认。

ProcessSerialNumber psn = { 0, kCurrentProcess };
CFMachPortRef eventTap = CGEventTapCreateForPSN(
&psn,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit(kCGEventKeyDown)
| CGEventMaskBit(kCGEventKeyUp),
eventCallback,
userInfo);

我可以使用CGEventTapCreate,但它会点击整个主机,然后我需要过滤任何未定向到我的应用程序的内容,并且CGEventTapProxy是不透明的,我不知道如何使用它来确定是否是我的应用程序。

我已验证已弃用的代码仍然有效,但 Apple 可以随时决定删除它。那么,有人知道我应该如何在 Mavericks 及其他地方调用 CGEventTapCreateForPSN 吗?

谢谢!

<小时/>

更新

在10.11(我认为是El Capitan)中,添加了一个新功能。虽然它的文档为零,但它的签名与 CGEventTapCreateForPSN 几乎完全相同。

CFMachPortRef CGEventTapCreateForPSN(
void *processSerialNumber,
CGEventTapPlacement place,
CGEventTapOptions options,
CGEventMask eventsOfInterest,
CGEventTapCallBack callback,
void *userInfo);

CFMachPortRef CGEventTapCreateForPid(
pid_t pid,
CGEventTapPlacement place,
CGEventTapOptions options,
CGEventMask eventsOfInterest,
CGEventTapCallBack callback,
void *userInfo);

因此,不再需要已弃用的函数,因为 PID 可以用作第一个参数。

最佳答案

我认为您应该为此目的子类化 NSApplication 并重写 - (void)sendEvent:(NSEvent *)theEvent 方法。来自 docs :

You rarely should find a real need to create a custom NSApplication subclass. Unlike some object-oriented libraries, Cocoa does not require you to subclass NSApplication to customize app behavior. Instead it gives you many other ways to customize an app.

另外:

IMPORTANT

Many AppKit classes rely on the NSApplication class and may not work properly until this class is fully initialized. As a result, you should not, for example, attempt to invoke methods of other AppKit classes from an initialization method of an NSApplication subclass.

因此,您可以拦截通过应用程序传递的所有事件并调用自定义 NSApplicationDelegate 继承的协议(protocol)方法。

// in SubApplication.h

@protocol ExtendedApplicationDelegate : NSApplicationDelegate

- (void)applicationDidTrapSomeInterestingEvent:(NSEvent *)event;

@end

// in SubApplication.m

- (void)sendEvent:(NSEvent *)event
{
if ([event type] == NSKeyDown && [event keyCode]==_someCode)
{
// call application delegate method
}
[super sendEvent:event];
}

我不确定这种方法是否能解决问题,但你还是尝试一下。

关于macos - Mavericks+ 中的 CGEventTapCreateForPSN(已弃用 GetCurrentProcess),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29403795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com