Как нарисовать рабочий стол на Mac OS X?
Я хочу нарисовать рабочий стол на Mac OS X (Snow Leopard). В частности, я хочу достичь того же эффекта, что и запуск:
/System/Library/Frameworks/ScreenSaver.framework/Resources/
ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background
(Если вы не рядом с компьютером, это отображает заставку, где вы обычно видите фон рабочего стола.)
Я знаю, как сделать окно без границы (путем подкласса NSWindow и переопределения initWithContentRect:styleMask:backing:defer: чтобы установить стиль окна в NSBorderlessWindowMask) и без тени (сетхассадоу: нет.)
Я знаю, что могу вызвать setLevel: kCGDesktopWindowLevel или kCGDesktopIconWindowLevel, чтобы поместить мое окно под другие окна (см. вопрос 418791.) Однако это не совсем то, что я хочу, потому что окно на этом уровне все еще находится поверх значков рабочего стола. Я хочу быть поверх фона рабочего стола, но ниже значков.
мой взгляд, непрозрачно. Если есть техника, которая разбивает фон рабочего стола, это нормально.
2 ответов
вы должны создать подкласс 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;
}
чтобы отобразить над рабочим столом, но под значками рабочего стола, вам нужно сделать две вещи:
- вызов
[window setLevel:kCGDesktopWindowLevel]
плавать под другими окнами приложений. - вызов
[window orderBack:self]
для слоя за окном, которое рисует значки рабочего стола.
что-то во время запуска приложения выводит приложение на передний план, поэтому вы должны вызвать orderBack: in applicationDidFinishLaunching: метод делегата приложения.