从命令行锁定屏幕与OS X上的Keychain Access一样

时间:2013-12-02 00:55:17

标签: macos cocoa

我注意到/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend和Keychain Access的锁屏(打开其首选项,选中'在菜单栏中显示钥匙串状态',然后从状态栏图标点击锁定屏幕。)具有不同的功能。有没有办法从命令行通过Terminal.app或Cocoa API运行Keychain Access的锁屏?

Mac OS 10.9。谢谢!

3 个答案:

答案 0 :(得分:10)

我刚刚找到了解决方案:https://apple.stackexchange.com/a/123738/72534

#import <objc/runtime.h>
#import <Foundation/Foundation.h>

int main () {
    NSBundle *bundle = [NSBundle bundleWithPath:@"/Applications/Utilities/Keychain Access.app/Contents/Resources/Keychain.menu"];

    Class principalClass = [bundle principalClass];

    id instance = [[principalClass alloc] init];

    [instance performSelector:@selector(_lockScreenMenuHit:) withObject:nil];

    return 0;
}

另存为lockscreen.m并编译:

clang -framework Foundation -o lockscreen lockscreen.m

完美运行,因为它只调用与状态栏图标相同的例程。

答案 1 :(得分:0)

https://stackoverflow.com/a/16368803/447697可能有用。

本质:

io_registry_entry_t entry = IORegistryEntryFromPath(kIOMasterPortDefault, "IOService:/IOResources/IODisplayWrangler");

if (entry) {
    IORegistryEntrySetCFProperty(entry, CFSTR("IORequestIdle"), kCFBooleanTrue);
    IOObjectRelease(entry);
}

答案 2 :(得分:0)

如上所述,错误“没有选择器'_lockScreenMenuHit:'的已知实例方法”,因为编译器无法判断运行时之前“instance”中是否存在此类方法。为了解决这个问题,我创建了一个NSBundle的子类,我将其命名为“newPrincipalClass”,并在该类中创建了一个名为 - (void)_lockScreenMenuHit:(id)a的实例方法。

修改后的主文件包含以下代码:

#import <objc/runtime.h>
#import <Foundation/Foundation.h>
#import "newPrincipalClass.h"

int main()
{
    NSBundle* bundle =[NSBundle bundleWithPath:@"/Applications/Utilities/Keychain Access.app/Contents/Resources/Keychain.menu"];
    Class newPrincipalClass = [bundle principalClass];
    id instance =[[newPrincipalClass alloc] init];
    [instance _lockScreenMenuHit:NULL];

    return 0
}

因此,我使用我的新子类“newPrincipalClass”创建“实例”,其中包含一个名为“_lockScreenMenuHit:”的方法。现在,当编译器检查“instance”内部时,它会找到方法的名称,因此不会显示错误。你有它,程序运行没有问题!