要在OS X Lion上启动屏幕保护程序,我使用系统范围的键盘快捷键,使用简单的AppleScript立即启动屏幕保护程序:
tell application "ScreenSaverEngine" to launch
虽然这在大多数情况下都能正常工作,但是在调用脚本时正好移动鼠标时会出现一个奇怪的问题。然后,加载ScreenSaverEngine.app并锁定桌面,但ScreenSaverEngine UI不会显示。相反,桌面仍然可见,但无法将焦点设置在其他应用程序或UI控件上;桌面会话基本上是锁定的。
“解锁”桌面的唯一方法是强制将焦点设置在Activity Monitor应用程序上(通过按住Ctrl键单击其停靠图标并选择“显示所有Windows”),然后终止ScreenSaverEngine进程。
通过从终端启动ScreenSaverEngine,可以轻松复制相同的行为:
/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine
并在按下Enter键的同时主动移动鼠标光标。
有没有人知道可用于以编程方式启动屏幕保护程序的方法,并且不会遇到此问题?
注意:我知道还有其他选项来锁定屏幕(快速用户切换,钥匙串锁定和Hot Corners),但我对这些解决方案不感兴趣,我需要一种方法以编程方式启动屏幕保护程序。
答案 0 :(得分:0)
我在谷歌深处找到了答案。使用私有ScreenSaver.framework中未记录的ScreenSaverController类启动屏幕保护程序可以按预期工作。
我使用以下标题:
#import <Foundation/Foundation.h>
@interface ScreenSaverController : NSObject
+ controller;
@end
@protocol ScreenSaverControl
- (BOOL) screenSaverIsRunning;
- (BOOL) screenSaverCanRun;
- (void) setScreenSaverCanRun:(BOOL)fp8;
- (void) screenSaverStartNow;
- (void) screenSaverStopNow;
- (void) restartForUser:(id)fp8;
- (double) screenSaverTimeRemaining;
- (void) screenSaverDidFade;
- (BOOL) screenSaverIsRunningInBackground;
- (void) screenSaverDidFadeInBackground:(BOOL)fp8
psnHi:(unsigned int)fp12
psnLow:(unsigned int)fp16;
@end
并将ScreenSaver.framework链接到我的项目。启动屏幕保护程序就像这样简单:
[[ScreenSaverController controller] screenSaverStartNow];
当屏幕保护程序以这种方式启动时,我在我的问题中描述的行为无法再现。如果在调用此方法时主动移动鼠标,屏幕保护程序立即返回时屏幕会快速闪烁(不锁定桌面)。
适用于10.6.8和10.7.4。
免责声明:谨慎使用Apple框架中未记录的类,因为它们不受支持,并且在未来版本的OS X中功能可能会中断(考虑弱链接)。此外,它将取消您的应用程序与App Store的资格。