2011-02-18 53 views
5

因此,我正在构建一个站在展览上供公众使用的程序,并且我有一个任务来使其处于非活动状态。只需从屏幕上的文件夹中显示一些随机视频,如屏幕保护程序,但在应用程序中。知道应用程序在可可Mac OSX中处于不活动状态的最佳方法是什么?

那么检查用户是否处于非活动状态的最佳方法是什么?

我在想的是某种全局计时器,它会在每个用户输入上得到重置,并且如果达到可以让1分钟进入非活动模式。有没有更好的方法?

回答

1

这可能听起来像一个愚蠢的问题;但为什么不建立一个屏幕保护程序,用一个短保险丝?

如果您需要在用户走开时执行任何重置或清理,则可以侦听名为@“com.apple.screensaver.didstart”的NSNotification。

编辑:你也可以设置屏幕保护程序;等待它开火,然后在开始时自己做,在显示自己的视频时停止屏幕保护程序;但设置屏幕保护程序的正确方法是大概一个好主意。

+0

这将是巨大的,如果有任何地方良好的屏保与我正在寻找的功能,必须从我的应用程序等视频放置一些自定义信息:( – tobros91 2011-02-18 10:03:01

1

我发现了一个使用HID管理器的解决方案,这似乎是在Cocoa中完成它的方式。 (有碳素另一种解决方案,但它并不适用于64位操作系统X上运行)

Dan and Cheryl's Place博客引用丹尼尔·里斯:

#include <IOKit/IOKitLib.h> 

/* 
Returns the number of seconds the machine has been idle or -1 on error. 
The code is compatible with Tiger/10.4 and later (but not iOS). 
*/ 
int64_t SystemIdleTime(void) { 
    int64_t idlesecs = -1; 
    io_iterator_t iter = 0; 
    if (IOServiceGetMatchingServices(kIOMasterPortDefault, 
            IOServiceMatching("IOHIDSystem"), 
            &iter) == KERN_SUCCESS) 
    { 
     io_registry_entry_t entry = IOIteratorNext(iter); 
     if (entry) { 
      CFMutableDictionaryRef dict = NULL; 
      kern_return_t status; 
      status = IORegistryEntryCreateCFProperties(entry, 
                 &dict, 
                 kCFAllocatorDefault, 0); 
      if (status == KERN_SUCCESS) 
      { 
       CFNumberRef obj = CFDictionaryGetValue(dict, 
                 CFSTR("HIDIdleTime")); 
       if (obj) { 
        int64_t nanoseconds = 0; 
        if (CFNumberGetValue(obj, 
             kCFNumberSInt64Type, 
             &nanoseconds)) 
        { 
         // Convert from nanoseconds to seconds. 
         idlesecs = (nanoseconds >> 30); 
        } 
       } 
       CFRelease(dict); 
      } 
      IOObjectRelease(entry); 
     } 
     IOObjectRelease(iter); 
    } 
    return idlesecs; 
} 

的代码已经略作修改,以使其适合转换为80字符的计算器限制。

3

您可以使用CGEventSourceSecondsSinceLastEventType

返回经过的时间为石英事件 源的最后一个事件。

/* 
To get the elapsed time since the previous input event—keyboard, mouse, or tablet—specify kCGAnyInputEventType. 
*/ 
- (CFTimeInterval)systemIdleTime 
{  
    CFTimeInterval timeSinceLastEvent = CGEventSourceSecondsSinceLastEventType(kCGEventSourceStateHIDSystemState, kCGAnyInputEventType); 
    return timeSinceLastEvent; 
} 
2

我扩大对Parag Bafna的答案。在Qt你可以做

#include <ApplicationServices/ApplicationServices.h> 

double MyClass::getIdleTime() { 
    CFTimeInterval timeSinceLastEvent = CGEventSourceSecondsSinceLastEventType(kCGEventSourceStateHIDSystemState, kCGAnyInputEventType); 
    return timeSinceLastEvent; 
} 

您也可以框架添加到您的.pro文件:

QMAKE_LFLAGS += -F/System/Library/Frameworks/ApplicationServices.framework 
LIBS += -framework ApplicationServices 

函数的文档here

相关问题