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

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)。但是这不完全是我想要的,因为此级别上的窗口仍然位于桌面图标之上。我希望在桌面背景上方,但低于图标。

我的视图不透明。如果有一种技术可以破坏桌面背景,那就可以用它。

2个回答

22

你应该创建一个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;
}

4

要在桌面上方但在桌面图标下方显示,您需要完成两个步骤:

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

应用程序启动时会有某些操作使应用程序到前台,因此您应该在应用程序委托的 applicationDidFinishLaunching: 方法中调用 orderBack:。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接