在10.6中锁定屏幕

时间:2010-01-28 06:12:45

标签: objective-c cocoa macos osx-snow-leopard

如何锁定像Keychain这样的屏幕,意味着阻止所有访问Dock,菜单栏,桌面等等。基本上只是一个黑屏我可以添加一个密码字段,供用户返回桌面?我很清楚Carbon方法,但我想要NSApplication方法,因为这是一个全Cocoa应用程序。

感谢〜

2 个答案:

答案 0 :(得分:5)

如果你不能自己编写这些代码,那就更好了。考虑到多年来在屏幕锁定代码中发现的漏洞数量,编写自己的代码来锁定屏幕通常是一个糟糕的主意。如果你有一个可以做到的Carbon调用,请继续使用它...不要担心Cocoa代码的“纯度”。

但是,如果您决定自己编写,请执行以下操作:

首先,使用CoreGraphics捕获所有屏幕。请参阅:http://developer.apple.com/mac/library/documentation/GraphicsImaging/Conceptual/QuartzDisplayServicesConceptual/Articles/DisplayCapture.html

接下来,创建一个新的NSWindow并将其放在用于捕获屏幕的窗口前面。您必须调用CG函数来获取覆盖每个屏幕的黑色窗口的“顺序”,并在其前面订购新窗口。通常情况下,黑色窗口有一个向前的顺序,一切都在它后面。在窗口中输入密码字段。 NOT 使用普通文本字段或编写自己的密码输入代码。密码输入字段中包含大量特殊代码,因此您无法复制文本,而其他程序在您输入密码字段时无法听到击键。所以使用Apple提供的那个。

最后,将计算机置于“kiosk模式”。此模式允许您禁用alt-tab,用户切换,菜单栏和停靠,甚至强制退出的功能。请参阅:http://developer.apple.com/mac/library/technotes/KioskMode/Introduction/Introduction.html

这不是很多代码,只是使用了一些不同的API,因此您将花费大部分时间在API文档之间蹦蹦跳跳。我建议将屏幕锁定代码编写为自己的应用程序(只需在Xcode项目中添加新的应用程序目标),然后将屏幕锁定器放入应用程序包中。这曾经是(截至10.4)Apple Remote Desktop如何实现“锁屏”功能,但我再也找不到该应用程序。

答案 1 :(得分:1)

我认为直到10.6才会引入SetSystemUIMode API的Cocoa替换。

如果您可以使用仅限Snow-Leopard的代码,NSApplication上的答案为- setPresentationOptions: