在Mac OS X上编程获取休眠时间(以及其他节能设置)

4
我想在Mac OS X上通过编程的方式获取电源管理器中的设置,特别是我正在编写的小应用程序中的“显示睡眠”或“计算机睡眠”设置。 我知道可以检索睡眠设置,例如,使用这个SO答案中的命令行。请参考以下截图: enter image description here
 pmset -g | grep "^[ ]*sleep" | awk '{ print $2 }'

这段代码打印了60(我的正确睡眠时间),但是如果可能的话,我更想使用本地API获取这些设置。不幸的是,到目前为止,我的谷歌搜索没有找到有用的东西。NSUserDefaults是我找到的最接近的,但我看不出它如何用于获取我想要的设置。

有人能帮忙吗?


谢谢提供链接。在我的研究中,我也发现了几个类似的结果。例如IOPMLib等,但都不符合我的要求。我本以为这样的事情应该是一个被广泛使用和记录的东西 - 要么我错过了一些明显的东西,要么我是错的! - binarybob
2个回答

1

是的,这个问题已经超过4年了...不清楚需要使用哪种语言编写代码。使用Objective-C。

节能器首选项可以在以下位置找到:

/Library/Preferences/SystemConfiguration/com.apple.PowerManagement.plist

从Mac应用程序内部,我们现在可以使用:

NSString *powerMgt = @"/Library/Preferences/SystemConfiguration/com.apple.PowerManagement.plist";
NSDictionary *power = [NSDictionary dictionaryWithContentsOfFile:powerMgt];
// for example the sleep time on AC power
NSNumber *sleepyTime = [[[power objectForKey:@"Custom Profile"] objectForKey:@"AC Power"] objectForKey:@"System Sleep Timer"];

字典的样子如下:

{
    ActivePowerProfiles =     {
        "AC Power" = "-1";
        "Battery Power" = "-1";
    };
    "Custom Profile" =     {
        "AC Power" =         {
            "Disk Sleep Timer" = 10;
            "Display Sleep Timer" = 10;
            "Display Sleep Uses Dim" = 1;
            GPUSwitch = 2;
            "Hibernate File" = "/var/vm/sleepimage";
            "Hibernate Mode" = 3;
            "Mobile Motion Module" = 1;
            PrioritizeNetworkReachabilityOverSleep = 0;
            "Standby Delay" = 4200;
            "Standby Enabled" = 0;
            "System Sleep Timer" = 0;
            TTYSPreventSleep = 1;
            "Wake On AC Change" = 0;
            "Wake On Clamshell Open" = 1;
            "Wake On LAN" = 1;
        };
        "Battery Power" =         {
            "Disk Sleep Timer" = 10;
            "Display Sleep Timer" = 10;
            "Display Sleep Uses Dim" = 1;
            GPUSwitch = 2;
            "Hibernate File" = "/var/vm/sleepimage";
            "Hibernate Mode" = 3;
            "Mobile Motion Module" = 1;
            ReduceBrightness = 1;
            "Standby Delay" = 4200;
            "Standby Enabled" = 0;
            "System Sleep Timer" = 15;
            TTYSPreventSleep = 1;
            "Wake On AC Change" = 0;
            "Wake On Clamshell Open" = 1;
        };
    };
}

0

在查看pmset的源代码后,我得出了以下结论:

#include <SystemConfiguration/SystemConfiguration.h>
#include <CoreFoundation/CoreFoundation.h>

#define kIOPMDynamicStoreSettingsKey "State:/IOKit/PowerManagement/CurrentSettings"
#define kIOPMSystemSleepKey "System Sleep Timer"

SCDynamicStoreRef dynamicStore = SCDynamicStoreCreate(NULL, CFSTR("get-sleep-time"), NULL, NULL);
CFDictionaryRef dictionaryRef = SCDynamicStoreCopyValue(dynamicStore, CFSTR(kIOPMDynamicStoreSettingsKey));
CFTypeRef typeRef = CFDictionaryGetValue(dictionaryRef, CFSTR(kIOPMSystemSleepKey));

int minutes;
CFNumberGetValue(typeRef, kCFNumberIntType, (void *)&minutes);

CFRelease(dynamicStore);
CFRelease(dictionaryRef);
CFRelease(typeRef);

minutes 将包含计算机睡眠值(以分钟为单位)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接