【问题标题】:Notification after user becomes idle on OS X?用户在 OS X 上空闲后的通知?
【发布时间】:2012-11-05 18:13:11
【问题描述】:

检测用户何时空闲 X 时间,然后检测用户何时立即活跃的最佳方法是什么?

我知道有 NSWorkspace 提供将/已睡眠/唤醒通知,但我不能依赖它,因为睡眠设置通常约为 15 分钟到永远不会。我需要能够检测用户是否空闲了大约 1-2 分钟。

这个answer 提供了一种获取空闲时间的方法。如果可能,我想避免轮询。

【问题讨论】:

  • 为什么要避免轮询?您可能不必非常频繁地进行轮询。你需要什么分辨率? 1分钟? 1 秒?每分钟轮询一次不会是低效的。即使每秒一次也不会太糟糕。
  • 每秒轮询一次会泄漏笔记本电脑的电池电量。你真的不应该这样做。

标签: objective-c macos osx-lion osx-mountain-lion python-idle


【解决方案1】:

据我所知,投票是您唯一的选择。正如 user1118321 指出的那样,每 O(分钟)轮询一次不太可能导致任何问题、性能或其他问题。

如果您的应用具有 GUI 并接收 UI 事件,您可以通过 +[NSEvent addLocalMonitorForEventsMatchingMask:handler:] 安装一个处理程序,该处理程序会在每个事件上重置您的计时器。当用户持续活跃时,至少在您自己的应用中,这将有助于减少(如果不是消除)民意调查。

一旦您确定用户已经闲置了足够长的时间,您就可以安装一个全局事件水龙头来监视下一个事件。参见例如-[NSEvent addGlobalMonitorForEventsMatchingMask:handler:]

注意:如果可能,您应该使用CGEventSourceSecondsSinceLastEventType,而不是进入 IO 注册表。这是一个正式的、受支持的 API,可能更有效。更不用说它更简单。还有 UKIdleTimer 虽然它依赖于 Carbon,所以可能不适用。

【讨论】:

  • 我最终使用CGEventSourceSecondsSinceLastEventType 来计算何时触发 NSTimer(60 秒 - idleTime)。当用户空闲时,我使用 CGEventTapEnable 启用我的事件点击。当用户再次处于活动状态时,我使用相同的命令禁用它。事件点击以kCGEventMaskForAllEventskCGEventTapOptionListenOnly 开头。似乎工作得很好!
猜你喜欢
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 2011-04-02
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
相关资源
最近更新 更多