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

时间:2011-02-13 05:20:12

标签: cocoa macos appkit

我想在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将我的窗口放在其他窗口下面(参见question 418791。)但是这不是我想要的,因为这个级别的窗口仍然位于顶层桌面图标。我想要在桌面背景之上,但在图标下面。

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

要在桌面上方但在桌面图标下方显示,您需要做两件事:

  1. 调用[window setLevel:kCGDesktopWindowLevel]以浮动在其他应用程序窗口下方。
  2. 调用[window orderBack:self]覆盖绘制桌面图标的窗口后面。
  3. 应用程序启动期间的某些内容会将应用程序带到前面,因此您应该在应用程序委托的applicationDidFinishLaunching:方法中调用orderBack: