Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 在NPAPI插件中处理CGEventTaps_Cocoa_Npapi_Cgeventtap - Fatal编程技术网

Cocoa 在NPAPI插件中处理CGEventTaps

Cocoa 在NPAPI插件中处理CGEventTaps,cocoa,npapi,cgeventtap,Cocoa,Npapi,Cgeventtap,我正在尝试创建一个NPAPI插件来监听macbook上的媒体键,并将其传递给javascript以控制pandora或soundcloud之类的东西。我使用的是Spotify的SPMediaKeyTap库,它只包装在单独线程上运行的CGEventTap 我的问题是,我使用npn_调用来调用javascript。这可以正常工作,但是当它从CGEventTap回调触发时,插件就会崩溃。我意识到这需要从插件线程运行,我已经尝试通过使用[NSObject performSelectorOnMainThr

我正在尝试创建一个NPAPI插件来监听macbook上的媒体键,并将其传递给javascript以控制pandora或soundcloud之类的东西。我使用的是Spotify的SPMediaKeyTap库,它只包装在单独线程上运行的CGEventTap


我的问题是,我使用npn_调用来调用javascript。这可以正常工作,但是当它从CGEventTap回调触发时,插件就会崩溃。我意识到这需要从插件线程运行,我已经尝试通过使用[NSObject performSelectorOnMainThread]和[NSObject performSelector:onThread]将其传递回主线程,该线程已存储在主插件线程创建方法中。这两种解决方案仍然会在任何npn调用时崩溃。在处理CGEventTap事件时,是否还有其他情况会导致状态对NPN浏览器交互调用无效?

不要像保存线程那样试图猜测线程模型;只需使用performSelectorOnMainThread调用NPN方法。我一直都在这样做,而且效果很好,所以我猜您的跨线程编组方法的某些方面没有按照它需要的方式工作。

是否有崩溃位置的堆栈跟踪?以及如何调用NPN_Invoke的示例代码?因此在NPP_New中,我使用main_thread=[NSThread currentThread]存储线程;然后在SPMediaKeyTap的处理程序中,我使用主线程调用[self-performSelector:onThread:blahblah:],它在以下行崩溃:browser->getvalue(实例,NPNVWindowNPObject,&window);我不确定如何在NPAPI插件中获取堆栈跟踪…当我访问该浏览器对象(NPNetscapeFuncs*)时,它似乎崩溃了。我认为现在的情况是,关键事件出现在主Chrome进程中,它无法访问插件进程中的浏览器变量。我在那条线路上发现EXC\u坏访问/内核保护故障。如果我将命令存储到一个静态变量中,然后在HandleEvent中检查它并在那里调用JS函数,那么它就可以正常工作。我只是需要一些方法来告诉插件在UI过程中的插件过程中做一些事情。