2

OS X Lionでスクリーンセーバーを起動するには、システム全体のキーボードショートカットを使用して、簡単なAppleScriptを使用してスクリーンセーバーをすぐに起動します。

tell application "ScreenSaverEngine" to launch

これはほとんどの場合完全に機能しますが、スクリプトが呼び出されたときにマウスを正確に動かすと、奇妙な問題が発生します。次に、ScreenSaverEngine.appが読み込まれ、デスクトップがロックされますが、ScreenSaverEngineUIは表示されません。代わりに、デスクトップは引き続き表示されますが、他のアプリケーションやUIコントロールにフォーカスを設定することはできません。デスクトップセッションは基本的にロックされています。

デスクトップを「ロック解除」する唯一の方法は、Activity Monitorアプリにフォーカスを強制的に設定し(Ctrlキーを押しながらドックアイコンをクリックして[すべてのウィンドウを表示]を選択)、ScreenSaverEngineプロセスを強制終了することです。

ターミナルからScreenSaverEngineを起動すると、同じ動作を簡単に再現できます。

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

Enterキーを押しながらマウスカーソルをアクティブに動かします。

プログラムでスクリーンセーバーを起動するために使用でき、この問題に悩まされていない方法を知っている人はいますか?

注:画面をロックする他のオプション(ユーザーの高速切り替え、キーチェーンロック、ホットコーナー)があることは知っていますが、これらのソリューションには興味がないので、プログラムでスクリーンセーバーを起動する方法が必要です。

4

1 に答える 1

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の将来のバージョンで機能が機能しなくなる可能性があるため、注意して使用してください(弱いリンクを検討してください)。また、AppStoreからアプリを失格にします。

于 2012-07-24T08:12:40.060 に答える