Как бы я разработал что-то вроде DeskLock от Deskshade? - PullRequest
0 голосов
/ 25 февраля 2010

Извините за неудобства, но у меня есть еще один вопрос. Как бы я сделал что-то вроде DeskLock из приложения Macrabbit's Deskshade? Я сделал маленькое окошко, и это так далеко, как я пришел. Я знаю, как «заблокировать» экран в 10.6 с помощью PresentationOptions, но я не хочу рисковать, потому что в прошлый раз он не пустил меня обратно;]

РЕДАКТИРОВАТЬ: приложение DeskShade на самом деле предназначено для покрытия вашего рабочего стола, скрывая все значки. Это также позволяет вам рандомизировать узоры обоев с помощью нескольких исчезающих / смахиваний. Существует одна дополнительная функция, называемая DeskLock, которая фактически представляет полупрозрачный черный скос (похожий на сборку AppSwitcher для Mac) со значком замка, и вы можете разместить личный текст. Когда вы щелкаете по значку замка, он представляет модал, запрашивающий пароль, который вы можете установить. Вы также можете просто ввести этот пароль, ничего не нажимая, затем нажать клавишу Enter, и он разблокирует экран. Здесь также используется функция DeskShade, позволяющая скрыть рабочий стол.

Спасибо!

1 Ответ

1 голос
/ 01 марта 2010

Чтобы создать оверлейное окно, вы должны создать подкласс NSWindow и установить его маску стиля и цвет фона:

@implementation BigTransparentWindow
- (id)initWithContentRect:(NSRect)contentRect 
                styleMask:(NSUInteger)windowStyle 
                  backing:(NSBackingStoreType)bufferingType 
                    defer:(BOOL)deferCreation
{
    self = [super initWithContentRect:contentRect 
                            styleMask:NSBorderlessWindowMask //this makes the window transparent
                              backing:bufferingType
                                defer:deferCreation];
    if(self)
    {
        [self setOpaque:NO];
        [self setHasShadow:NO];
        [self setBackgroundColor:[[NSColor blackColor] colorWithAlphaComponent:0.5]];
    }
    return self;
}
@end

Затем вам нужно установить рамку окна так, чтобы она покрывала все экраны, и вам необходимо соответствующим образом установить уровень окна:

- (IBAction)showWindow:(id)sender
{
    //set the window so it covers all available screens
    NSRect screensRect = NSZeroRect;
    for(NSScreen* screen in [NSScreen screens])
    {
        screensRect = NSUnionRect(screensRect,[screen frame]);
    }
    [yourWindow setFrame:screensRect display:YES];

    if(coverScreen)
    {
        //set the window so it is above all other windows
        [yourWindow setLevel:kCGMaximumWindowLevel];
    }
    else
    {
        //set the window so it sits just above the desktop icons
        [yourWindow setLevel:kCGDesktopIconWindowLevel + 1];
    }
}

Как вы упомянули, вы можете использовать настройки NSApplicationPresentationOptions для NSApp, чтобы контролировать, как пользователь может взаимодействовать с системой. Простой способ проверить это, не блокируя себя, - установить NSTimer, который вызывает метод, который выводит приложение из режима киоска после истечения времени ожидания.

...