我想在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。)但是这不是我想要的,因为这个级别的窗口仍然位于顶层桌面图标。我想要在桌面背景之上,但在图标下面。
我的观点不透明。如果有一种技术可以破坏桌面背景,那就没问题。
答案 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)
要在桌面上方但在桌面图标下方显示,您需要做两件事:
[window setLevel:kCGDesktopWindowLevel]
以浮动在其他应用程序窗口下方。[window orderBack:self]
覆盖绘制桌面图标的窗口后面。应用程序启动期间的某些内容会将应用程序带到前面,因此您应该在应用程序委托的applicationDidFinishLaunching:方法中调用orderBack: