对不起,很麻烦,但是我还有另一个问题。我将如何从macrabbit的Deskshade应用程序中执行DeskLock之类的操作?我做了一个小窗户,这是我所走的路。我知道如何使用PresentationOptions将屏幕“锁定”在10.6中,但是我不想冒险,因为上一次它不会让我回来;]

编辑:DeskShade应用程序实际上旨在覆盖您的桌面,隐藏所有图标。它还允许您通过多次淡入/淡出来随机化墙纸图案。还有一个称为DeskLock的附加功能,它实际上提供了带有锁定图标的半透明黑色斜面(类似于Mac中内置的AppSwitcher),并且您可以放置​​个人文本。当您单击锁定图标时,它将显示一个模式,要求您​​设置密码。您也可以只键入此密码而无需按任何键,然后按Enter键,它会解锁屏幕。这也使用了隐藏桌面的DeskShade功能。

谢谢!

最佳答案

要创建覆盖窗口,您必须继承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];
    }
}


如前所述,您可以使用NSApplicationPresentationOptionsNSApp设置来控制用户与系统进行交互的方式。一种简单的测试方法(不锁定自己)是设置NSTimer,该方法调用超时后将应用退出信息亭模式的方法。

10-08 10:54