如何以编程方式检测mac应用程序是否已“海滩”?

时间:2009-12-24 14:38:51

标签: user-interface macos

我想创建一个应用程序,它将监视我的计算机上运行的应用程序,并响应应用程序已进行海滩保护的情况。是否有可能(使用任何各种OSX编程工具 - 我将自己教自己Objective-C)来检测是否发生了这种情况?如果是这样,有人可以给我一个简短的代码样本吗?

2 个答案:

答案 0 :(得分:5)

我担心我不涉及实际的课程或职能,但我可以给你一个大纲。

首先,要了解每个Application(可能每个Window)都有一个支持它的事件队列。每个都由一个线程提供服务,该线程只是从队列中弹出一个事件*,进行一些处理,然后返回等待下一个事件。当事件队列没有得到足够快速的服务时,会出现一个“沙滩球”(当被系统强制时)。 “冻结”事件队列意味着应用程序在响应过去的某个事件时被锁定。

现在 - 在调试上下文之外 - 你不应该进入另一个应用程序并且调整线程的事件队列以查看它是否得到了服务。 但是你可以做的是定期发布一个违反回复的事件,如果没有回应,你知道应用程序被“锁定”。

这构成了民意调查,因此要警惕性能影响。

*事件包括按键,按键,鼠标移动,重新绘制等等。

答案 1 :(得分:1)

除了WindowServer本身,我所知道的其他可以检测到无响应的系统组件是强制退出对话框,spindump(在应用程序无响应时收集应用程序的采样配置文件)和Activity Monitor(可能是通过其pmTool特权子进程) )。也许在pmTool上运行strings可能会提供有关要使用的系统调用的提示?

请注意,这些都不会通过轮询完成其工作,因为没有应用程序被检测为无响应的直到它无法响应事件 - 如果应用程序挂起/执行大量计算而没有检查其事件队列但在此期间没有收到任何事件,然后它不会报告为无响应。