如何检测视频是否在Mac上运行?

时间:2011-11-22 04:33:51

标签: macos cocoa video python-idle

我想知道Mac的空闲时间。目前我使用此代码

CFMutableDictionaryRef properties = 0;
CFTypeRef obj;
mach_port_t masterPort;
io_iterator_t iter;
io_registry_entry_t curObj;

IOMasterPort(MACH_PORT_NULL, &masterPort);

/* Get IOHIDSystem */
IOServiceGetMatchingServices(masterPort, IOServiceMatching("IOHIDSystem"), &iter);
if (iter == 0)
{
    return -1;
}
else
{
    curObj = IOIteratorNext(iter);
}
if (IORegistryEntryCreateCFProperties(curObj, &properties, kCFAllocatorDefault, 0) == KERN_SUCCESS && properties != NULL)
{
    obj = CFDictionaryGetValue(properties, CFSTR("HIDIdleTime"));
    CFRetain(obj);
}
else
{
    return -1;
}

uint64_t tHandle = 0;
if (obj)
{
    CFTypeID type = CFGetTypeID(obj);

    if (type == CFDataGetTypeID())
    {
        CFDataGetBytes((CFDataRef) obj, CFRangeMake(0, sizeof(tHandle)), (UInt8*) &tHandle);
    }
    else if (type == CFNumberGetTypeID())
    {
        CFNumberGetValue((CFNumberRef)obj, kCFNumberSInt64Type, &tHandle);
    }
    else
    {
        // error
        tHandle = 0;
    }

    CFRelease(obj);

    tHandle /= 1000000; // return as milliseconds
}
else
{
    tHandle = -1;
}

CFRelease((CFTypeRef)properties);
IOObjectRelease(curObj);
IOObjectRelease(iter);
return (double)tHandle;

但是,如果有任何视频正在运行,我希望空闲时间保持为0。

是否需要检查代码示例或库? (包括在iTunes上运行的视频,VLC,浏览器上的youtube或任何其他视频应用程序)

2 个答案:

答案 0 :(得分:2)

我可以用几种方式解释你的问题:

如何确定屏幕保护程序何时启动?

检查以下脚本(original answer):

#!/bin/bash

systemSleepTimeMinutes=`pmset -g | grep "^[ ]*sleep" | awk '{ print $2 }'`

if [ $systemSleepTimeMinutes -gt "0" ]; then
    systemSleepTime=`echo "$systemSleepTimeMinutes * 60" | bc`
    devicesIdleTime=`ioreg -c IOHIDSystem | awk '/HIDIdleTime/ {print $NF/1000000000; exit}'`
    secondsBeforeSleep=`echo "$systemSleepTime - $devicesIdleTime" | bc`
    echo "Time before sleep (sec): $secondsBeforeSleep"
    exit 0
else
    echo "The system is set to not sleep."
    exit 0
fi

如果屏幕保护程序被抑制,例如VLC,则结果为:

  

系统设置为不睡眠。

否则它会返回屏幕保护程序启动前的时间,例如:

  

睡前时间(秒):899.88056

通过NSTaskNSAppleScript运行上面的脚本并解析结果 请注意,“睡眠”也可以响应屏幕保护程序,具体取决于首先启动哪一个。

如何确定屏幕保护程序是否被抑制?

以下几行可以解决问题:

pmset -g | grep "^[ ]*sleep" | awk '{ print $2 }'

如果屏幕保护程序被抑制,则返回0 通过NSTaskNSAppleScript运行上面的行并解析结果。

如何屏蔽屏幕保护程序?

官方Apple文档(包括代码段):
How can I prevent system sleep while my application is running?


编辑 (回复评论)

  

但是,是否存在与此脚本相同的内置方法?

我不熟悉这种方法。我实际上怀疑它存在。

快速NSAppleScript示例:

NSString *source = @"do shell script \"pmset -g | grep \\\"^[ ]*sleep\\\" | awk '{ print $2 }'\"";
NSAppleScript *script= [[NSAppleScript alloc] initWithSource:source];
NSDictionary *scriptError = nil;
NSAppleEventDescriptor *descriptor=[script executeAndReturnError:&scriptError];
if(scriptError) {
    NSLog(@"Error: %@",scriptError);
} else {
    if ([[descriptor stringValue] intValue] == 0) {
        NSLog(@"Screensaver suppressed.");
    } else {
        NSLog(@"Screensaver not suppressed.");
    }
}

请不要对使用NSTaskNSAppleScript:)

保持沉默

答案 1 :(得分:0)

更好的是,请注意com.apple.screensaver.didstart和com.apple.screensaver.didstop