Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 从命令行锁定屏幕,与OSX上的Keychain Access相同_Macos_Cocoa - Fatal编程技术网

Macos 从命令行锁定屏幕,与OSX上的Keychain Access相同

Macos 从命令行锁定屏幕,与OSX上的Keychain Access相同,macos,cocoa,Macos,Cocoa,我注意到,/System/Library/CoreServices/Menu\Extras/User.Menu/Contents/Resources/CGSession-suspend和Keychain Access的锁屏(打开其首选项,选中“在菜单栏中显示Keychain状态”,然后从状态栏图标点击锁屏)具有不同的功能。有没有办法通过Terminal.app或Cocoa API从命令行运行Keychain Access的锁屏 MacOS10.9。谢谢 可能有用 基本上: io_registry

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

MacOS10.9。谢谢

可能有用

基本上:

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

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

我刚刚找到了一个解决方案:


工作正常,因为它只调用与状态栏图标相同的例程。

如上所述,发生错误“选择器的实例方法未知”\u lockScreenMenuHit:“,因为编译器在运行前无法判断“实例”中是否存在此类方法。为了解决这个问题,我创建了一个名为“newPrincipalClass”的NSBundle子类,并在该类中创建了一个名为-(void)\u lockscreen menuhit:(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.h”
int main()
{
NSBundle*bundle=[NSBundle bundleWithPath:@”/Applications/Utilities/Keychain Access.app/Contents/Resources/Keychain.menu“;
类newPrincipalClass=[bundle principalClass];
id实例=[[newPrincipalClass alloc]init];
[实例_lockScreenMenuHit:NULL];
返回0
}

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

正如最初的答案所提到的,该代码带来了睡眠模式,而不是锁屏模式,锁屏通常会询问您是否已从系统首选项中取消选中“需要密码”的安全和隐私。不过,谢谢你的评论。请从链接中发布解决方案的相关部分,如果链接无效,那么这个答案将是无用的。在Xcode上,我得到了选择器“\u lockScreenMenuHit:”的
未知实例方法,默认情况下,
,但编译
clang
成功了!生成此警告是因为编译器无法确保该对象实现了名为“\u lockScreenMenuHit:”的方法。事实上,如果苹果改变这个捆绑包中主体类的实现,程序可能会崩溃。我想在obj-c中有一种方法可以在运行时检查方法的存在性,但我只是希望示例尽可能简单。谢谢分享!是否有一种直接从命令行触发的方法,类似于问题中不太理想的示例?我尝试了
/Applications/Utilities/Keychain\Access.app/Contents/Resources/Keychain.menu/Contents/MacOS/Keychain
,但出现错误“无法执行二进制文件”。有没有一个选项或其他东西会产生与解决方案相同的效果?创建一个二进制可执行文件来激活另一个二进制可执行文件的一部分似乎很复杂。我认为这是不可能的。Keychain菜单二进制文件包含由某些主机应用程序执行的插件代码(在本例中类似于macOS的菜单栏系统)。因此,二进制文件不包含入口点,不能直接执行。
clang -framework Foundation -o lockscreen lockscreen.m
#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
}