如何在Mac OS X上绘制桌面?

Dom*_*ney 11 macos cocoa appkit

我想在Mac OS X(Snow Leopard)上绘制桌面.具体来说,我想达到与运行相同的效果:

/System/Library/Frameworks/ScreenSaver.framework/Resources/
ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background
Run Code Online (Sandbox Code Playgroud)

(如果您不在计算机附近,则会显示您通常会看到桌面背景的屏幕保护程序.)

我知道如何创建一个没有边框的窗口(通过子类化NSWindow并重写initWithContentRect:styleMask:backing:defer:将窗口样式设置为NSBorderlessWindowMask)并且没有阴影(setHasShadow:NO.)

我知道我可以调用setLevel:kCGDesktopWindowLevel或kCGDesktopIconWindowLevel将我的窗口放在其他窗口下面(参见问题418791.)然而,这并不是我想要的,因为此级别的窗口仍然位于桌面图标的顶部.我想要在桌面背景之上,但在图标下面.

我的观点不透明.如果有一种技术可以破坏桌面背景,那就没问题.

Rob*_*ger 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;
}
Run Code Online (Sandbox Code Playgroud)