2012-07-23 89 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的資格。

相關問題