2012-07-23 116 views
1

要启动OS X Lion的屏幕保护程序的桌面可能会变得无法使用,我用的是立即启动屏幕保护程序,使用简单的AppleScript全系统的键盘快捷键:OSX狮子错误:启动屏幕保护程序,当程序

tell application "ScreenSaverEngine" to launch 

虽然这在大多数情况下都能很好地工作,但在调用脚本时,鼠标移动的时候会出现一个奇怪的问题。然后,加载ScreenSaverEngine.app并锁定桌面,但ScreenSaverEngine UI不显示。相反,桌面仍然可见,但无法将注意力集中在其他应用程序或UI控件上;桌面会话基本锁定。

来“解锁”的桌面上的唯一方法是强制在活动监视器上的应用程序设置焦点(按Ctrl单击其Dock图标,然后选择显示所有窗口),然后杀死ScreenSaverEngine过程。

相同的行为可以通过从终端发射ScreenSaverEngine被容易地再现:

/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine 

积极移动鼠标光标的同时按下输入键。

有谁知道一种方法,可用于以编程方式启动屏幕保护程序,并没有遭受这个问题?

注:我知道还有其他选项可以锁定屏幕(快速用户切换,钥匙扣锁和热角),但我对这些解决方案不感兴趣,我需要一种以编程方式启动屏幕保护。

+0

我遇到完全相同的行为。 – Anne 2012-07-23 20:22:44

回答

0

我在Google的深处发现了自己的答案。使用私人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的资格。

相关问题