【问题标题】:"Lock" Screen On Mac AppMac App 上的“锁定”屏幕
【发布时间】:2012-05-18 23:33:39
【问题描述】:

在 Mac OS X 中,我需要调用什么 API 才能在整个屏幕以及菜单栏和停靠栏上放置一个窗口?另外,是否可以有效地将屏幕“锁定”到这个位置,禁用任务控制、启动板等?

我在 App Delegate 的实现文件中尝试了以下代码:

- (void)awakeFromNib {
    @try {
        NSApplicationPresentationOptions options = NSApplicationPresentationDisableForceQuit + NSApplicationPresentationDisableHideApplication + NSApplicationPresentationDisableProcessSwitching + NSApplicationPresentationHideDock + NSApplicationPresentationHideMenuBar + NSApplicationPresentationFullScreen;
        [NSApp setPresentationOptions:options];
        NSLog(@"Set presentation options"); 

    }
    @catch (NSException *exception) {
        NSLog(@"Error. Invalid options");
    }

}

NSLog 读取“设置演示选项”,但没有其他任何反应。有什么建议吗?

【问题讨论】:

    标签: objective-c macos lockscreen


    【解决方案1】:

    这基本上涉及与“信息亭模式”相同的事情。见Apple's Kiosk Mode Programming Topic

    您基本上将-[NSApplication setPresentationOptions:]-[NSView enterFullScreenMode:withOptions:] 与包含键NSFullScreenModeApplicationPresentationOptions 的选项字典一起使用,其值是NSNumber,其中包含与NSApplication 方法所采用的相同类型的表示选项值。

    【讨论】:

    • 感谢您的回复。请参阅我在 App Delegate 文件中放置的上述代码。奇怪的是,什么也没发生。
    • 什么都没有,包括NSLog()调用没有输出?
    • NSLog 确实读取了“设置演示选项”,因此它不是无效调用。只是屏幕上实际上没有发生任何事情。
    • 嗯,不知道发生了什么。似乎它应该工作。我无法想象NSAppnil。好吧,如果你不能让它工作,你可以使用Quartz Display Services 捕获显示。不过,这并不能阻止强制退出。
    • 想通了,在 MainWindow 和 App Delegate 文件中有冲突的代码。
    【解决方案2】:

    在 Xcode 中,创建一个新的 Cocoa 应用程序,并将下面的代码粘贴到 AppDelegate.m

    - (void)awakeFromNib
    {
        // Lock app in full screen mode for 10 seconds.
        NSApplicationPresentationOptions presentationOptions = (NSApplicationPresentationHideDock |
                                                                NSApplicationPresentationHideMenuBar |
                                                                NSApplicationPresentationDisableAppleMenu |
                                                                NSApplicationPresentationDisableProcessSwitching |
                                                                NSApplicationPresentationDisableForceQuit |
                                                                NSApplicationPresentationDisableSessionTermination |
                                                                NSApplicationPresentationDisableHideApplication);
        NSDictionary *fullScreenOptions = @{NSFullScreenModeApplicationPresentationOptions: @(presentationOptions)};
        [_window.contentView enterFullScreenMode:[NSScreen mainScreen] withOptions:fullScreenOptions];
        [_window.contentView performSelector:@selector(exitFullScreenModeWithOptions:) withObject:nil afterDelay:10.0];
    }
    

    您仍然可以使用⌘Q 退出应用程序。为了防止这种情况,您可以删除退出菜单项的等效键。

    或者,您可以subclass NSApplication and override -sendEvent: 什么都不做,从而忽略发送到您的应用程序的所有事件(键盘、鼠标等)。

    【讨论】:

      【解决方案3】:

      这些选项是 |'d 一起使用按位 OR:

      NSApplicationPresentationOptions options = NSApplicationPresentationDisableForceQuit | NSApplicationPresentationDisableHideApplication | NSApplicationPresentationDisableProcessSwitching | NSApplicationPresentationHideDock | NSApplicationPresentationHideMenuBar | NSApplicationPresentationFullScreen; [NSApp setPresentationOptions:options];

      【讨论】:

      • 使用了这些,我仍然可以 cmd+tab 退出我的应用程序。有什么建议吗?
      猜你喜欢
      • 2013-12-20
      • 1970-01-01
      • 2014-07-20
      • 2013-04-15
      • 2016-05-28
      • 2011-10-29
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多