osx – 小牛中的CGEventTapCreateForPSN(不推荐使用GetCurrentProcess)

osx – 小牛中的CGEventTapCreateForPSN(不推荐使用GetCurrentProcess),第1张

概述我正在使用CGEventTapCreateForPSN来捕获和过滤我的应用程序的密钥.我不会对其他应用程序拦截事件感兴趣.我非常确定一个事件点击对我来说太重了,但是我一直找不到更好的方法,并且使用事件点击工程. 具体来说,这段代码是我想要的. GetCurrentProcess(&psn);CFMachPortRef eventTap = CGEventTapCreateForPSN( 我正在使用CGEventTapCreateForPSN来捕获和过滤我的应用程序的密钥.我不会对其他应用程序拦截事件感兴趣.我非常确定一个事件点击对我来说太重了,但是我一直找不到更好的方法,并且使用事件点击工程.

具体来说,这段代码是我想要的.

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,userInfo);

我可以使用CGEventTapCreate,但是它会点击整个主机,然后我需要过滤没有指向我的应用程序的任何东西,CGEventTapProxy是不透明的,我不知道如何使用它来确定它的我的应用程序.

我已经验证了弃用的代码仍然可行,但Apple可以随时决定将其删除.那么,有没有人有一个想法,我应该如何继续在小牛和其他人中调用CGEventTapCreateForPSN?

谢谢!

解决方法 我认为你应该为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继承的协议方法.

// 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];}

我不知道这种方法是否解决了这个问题,但是你仍然会尝试一下.

总结

以上是内存溢出为你收集整理的osx – 小牛中的CGEventTapCreateForPSN(不推荐使用GetCurrentProcess)全部内容,希望文章能够帮你解决osx – 小牛中的CGEventTapCreateForPSN(不推荐使用GetCurrentProcess)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1028037.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存