12

Mac OS X(Snow Leopard)でデスクトップを描きたい。具体的には、ランニングと同じ効果を達成したいと思います。

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

(コンピューターの近くにいない場合は、通常デスクトップの背景が表示されるスクリーンセーバーが表示されます。)

境界線なし(NSWindowをサブクラス化し、initWithContentRect:styleMask:backing:defer:ウィンドウスタイルをNSBorderlessWindowMaskに設定する)およびシャドウなし(setHasShadow:NO)のウィンドウを作成する方法を知っています。

setLevel:kCGDesktopWindowLevelまたはkCGDesktopIconWindowLevelを呼び出して、ウィンドウを他のウィンドウの下に配置できることはわかっています(質問418791を参照)。ただし、このレベルのウィンドウはまだデスクトップアイコンの上にあるため、これは私が望むものではありません。デスクトップの背景の上に、アイコンの下に配置したい。

私の見方は不透明です。デスクトップの背景を覆い隠すテクニックがあれば、それは問題ありません。

4

2 に答える 2

21

のサブクラスを作成しNSWindow、レベルをに設定する必要があります(kCGDesktopWindowLevel - 1)。これにより、ウィンドウがアイコンの下に表示されます。また、ウィンドウがキーまたはメインにならないようにし、移動しないことでExposé/Spacesを適切に処理するようにする必要があります。

- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation
{
    self = [super initWithContentRect:contentRect styleMask:windowStyle backing:bufferingType defer:deferCreation];
    if(self)
    {
        [self setLevel:kCGDesktopWindowLevel - 1];
        [self setCollectionBehavior:
            (NSWindowCollectionBehaviorCanJoinAllSpaces | 
             NSWindowCollectionBehaviorStationary | 
             NSWindowCollectionBehaviorIgnoresCycle)];
    }
    return self;
}

- (BOOL)canBecomeMainWindow
{
    return false;
}

- (BOOL)canBecomeKeyWindow
{
    return false;
}
于 2011-02-13T23:05:58.957 に答える
4

デスクトップの上でデスクトップアイコンの下に表示するには、次の2つのことを行う必要があります。

  1. [window setLevel:kCGDesktopWindowLevel]他のアプリケーションウィンドウの下にフロートするように呼び出します。
  2. [window orderBack:self]デスクトップアイコンを描画するウィンドウの後ろのレイヤーを呼び出します。

アプリの起動中に何かがアプリケーションを前面に表示するため、アプリケーションデリゲートのapplicationDidFinishLaunching:メソッドでorderBack:を呼び出す必要があります。

于 2011-02-13T05:29:47.597 に答える