代码之家  ›  专栏  ›  技术社区  ›  Paul

如何关闭Mac屏幕保护程序?

  •  3
  • Paul  · 技术社区  · 15 年前

    我正在编写一个应用程序,它使用苹果的信息亭模式。我想禁用屏幕保护程序,但是“screensaverdefaults”类只报告自己是32位的。我可以将构建更改为仅32位,但我也希望能够支持64位体系结构。

    有没有其他框架可以用来禁用屏幕保护程序?

    3 回复  |  直到 13 年前
        1
  •  3
  •   vilhalmer    14 年前

    首先,您需要保存当前设置,以便您可以将其恢复到关闭前的状态:

    NSTask *readTask = [[NSTask alloc] init];
    [readTask setLaunchPath:@"/usr/bin/defaults"];
    
    NSArray *arguments = [NSArray arrayWithObjects:@"-currentHost", @"read", @"com.apple.screensaver", @"idleTime", nil];
    [readTask setArguments:arguments];
    
    NSPipe *pipe = [NSPipe pipe];
    [readTask setStandardOutput:pipe];
    
    NSFileHandle *file = [pipe fileHandleForReading];
    
    [readTask launch];
    [readTask release];
    
    NSData *data = [file readDataToEndOfFile];
    
    NSString *originalValue = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    

    所以现在你有了屏幕保护程序空闲时间的原始值。伟大的!别忘了。现在,您必须设置新值:

    NSTask *writeTask = [[NSTask alloc] init];
    [writeTask setLaunchPath:@"/usr/bin/defaults"];
    
    NSArray *arguments = [NSArray arrayWithObjects:@"-currentHost", @"write", @"com.apple.screensaver", @"idleTime", @"0", nil];
    [writeTask setArguments:arguments];
    
    [writeTask launch];
    [writeTask release];
    

    还有viola!您刚刚禁用了屏幕保护程序。要重新启用它,只需再次使用第二个代码块,但将originalvalue作为最后一个数组对象传递,而不是 @"0" ,像这样:

    NSArray *arguments = [NSArray arrayWithObjects:@"-currentHost", @"write", @"com.apple.screensaver", @"idleTime", originalValue, nil]
    

    享受!
    比利

    注意:最后一件事是,您可能会试图保存nstask对象以重新使用它们,但不要这样做。它们只能运行一次,因此每次您要这样做时都必须创建新的对象。

        2
  •  3
  •   Insomniac Software    13 年前

    对于任何一个搜索如何做到这一点(就像我一直在做的那样)并且不想在编辑首选项文件的时候乱来的人来说,苹果有一个适当的方法来阻止屏幕保护程序在应用程序运行时启动。

    Technical Q&A QA1160: Preventing sleep

    希望这有帮助。

        3
  •  1
  •   Paul    14 年前

    我最终做的是直接阅读 com.apple.screensaver 首选项文件并修改 idleTime askForPassword 使为零的值。简单的 CFPreferencesSynchronize 一切都很好!