OSX Lion bug:以编程方式启动屏幕保护程序时,桌面可能无法使用

时间:2012-07-23 09:27:11

标签: macos osx-lion applescript screensaver

要在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),但我对这些解决方案不感兴趣,我需要一种方法以编程方式启动屏幕保护程序。

1 个答案:

答案 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的资格。