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

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

  1. 调用[window setLevel:kCGDesktopWindowLevel]浮动在其他应用程序窗口下方。
  2. 调用[window orderBack:self]绘制桌面图标的窗口后面的图层。

应用程序启动期间的某些事情会将应用程序带到最前面,因此您应该在应用程序委托的 applicationDidFinishLaunching: 方法中调用 orderBack:。

于 2011-02-13T05:29:47.597 回答