具体来说,这段代码是我想要的.
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)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)