在 OS X 上使用 cocos2d 捕获显示(以及 Kiosk 模式问题)?

Posted

技术标签:

【中文标题】在 OS X 上使用 cocos2d 捕获显示(以及 Kiosk 模式问题)?【英文标题】:Capturing the display with cocos2d on OS X (and Kiosk mode problems)? 【发布时间】:2012-10-28 18:49:10 【问题描述】:

我用 cocos2d 为 Mac 构建了一个应用程序并实现了Apple's recommended steps for a Kiosk application。我的目标是拥有一个不允许退出应用程序并捕获所有键盘输入的全屏应用程序。

问题在于,在扩展键盘上,Kiosk 模式不会捕获控制 iTunes 的功能键或 F4 Launchpad 键。在禁用进程切换的情况下,用户仍然可以通过按 F4 来切换进程。 (我为此提交了一个雷达,因为它应该在 Kiosk 模式下被禁止。)我尝试子类化 NSApplication。我可以使用以下代码检测这些键的按下:

- (void)mediaKeyEvent: (int)key state: (BOOL)state repeat: (BOOL)repeat

    switch( key )
    
        case NX_KEYTYPE_PLAY:
            if( state == 0 )
                NSLog(@"Play pressed and released"); //Play pressed and released
            break;

        case NX_KEYTYPE_FAST:
            if( state == 0 )
                NSLog(@"Next pressed and released"); //Next pressed and released
            break;

        case NX_KEYTYPE_REWIND:
            if( state == 0 )
                NSLog(@"Previous pressed and released"); //Previous pressed and released
            break;

        case NX_KEYTYPE_LAUNCH_PANEL:
            if( state == 0 )
                NSLog(@"Launchpad pressed and released"); //Previous pressed and released
            break;
    

我试图通过- (void)sendEvent: (NSEvent*)event 的自定义实现来拦截它们,但无论我在那里做什么,它们都会被分派到系统中。

似乎解决方案是根据Apple programming note“捕获显示”。当您捕获显示时,应用程序会拦截所有键盘输入,并且不会将任何键盘输入进一步发送到系统。这一切都很好,我已经能够在普通应用程序中做到这一点。

然而,在我的 cocos2d OS X 应用程序中,OpenGL 和 GLView 的控制是在几个核心 cocos2d 文件中处理的,即CCGLView.mCCDirectorMac.m。我花了几个小时试图调整这些文件以捕获显示,但无法使其正常工作。

作为参考,这是我正在做的(AppDelegate.m)进入 Kiosk 模式:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

    ...

    NSApplicationPresentationOptions options = NSApplicationPresentationHideDock + NSApplicationPresentationDisableProcessSwitching + NSApplicationPresentationHideMenuBar;
    NSNumber *presentationOptions = [NSNumber numberWithUnsignedLong:options];
    NSArray *keys   = [NSArray arrayWithObjects:@"NSFullScreenModeAllScreens", @"NSFullScreenModeApplicationPresentationOptions", nil];
    NSArray *values = [NSArray arrayWithObjects:[NSNumber numberWithBool:YES], presentationOptions, nil];
    NSDictionary *fullScreenOptions = [[NSDictionary alloc] initWithObjects:values forKeys:keys];

    [glView_ enterFullScreenMode:[NSScreen mainScreen] withOptions:fullScreenOptions];

    [director runWithScene:[MyLayer scene]];

如何捕获显示(注意:这与截屏不同!)在 cocos2d 并防止功能键与除我的申请?


其他信息: -enterFullScreenMode:withOptions: 会捕获显示,但前提是您不发送 NSFullScreenModeApplicationPresentationOptions 作为选项之一。 Apple 文档在 NSView 和 Kiosk 模式文档中指定了这一点:

当你传递给的选项字典 enterFullScreenMode:withOptions: 确实包含一个值 NSFullScreenModeApplicationPresentationOptions,AppKit 没有 捕获任何显示,因为这样做会阻止显示 presentationOptions 控制的 UI 元素,例如菜单栏和 码头。

尽管如此,当您捕获显示时,媒体/iTunes/音量功能键不会被拦截,这是我在写这个问题时试图回答的问题的一部分。我向 Apple 提出了技术支持问题,因为似乎无法禁用它们。

【问题讨论】:

我无法提供答案,所以我想在评论中提出建议 - 试试ambrosiasw.com/utilities/snapzprox,它允许您设置录制屏幕的方式、地点和时间。希望您能找到更好的解决方案! 我想你误解了我所说的捕获显示的意思。我不是要截屏。根据 Apple 提供的定义,我正在尝试“捕获”它:developer.apple.com/library/mac/#documentation/graphicsimaging/… 【参考方案1】:

切换fn和普通按键功能:

系统偏好设置 键盘 启用Use all F1, F2, etc. keys as normal keys

然后您可以使用 fn+F12 访问正常的 F 功能(提高音量、降低音量)并捕获正常的F键。

【讨论】:

我知道该功能,但我不希望使用我尝试制作的软件的每个人都完成这些步骤。我只是想用与cocos2d集成的方式截屏。【参考方案2】:

您可能需要查看 CarbonEvents.h 以了解有关使用 PushSymbolicHotKeyMode / PopSymbolicHotKeyModekHIHotKeyModeAllDisabled 的信息。

【讨论】:

谢谢。我记得几个月前研究过它,但它最终不是我需要的,虽然我不记得为什么。我再看看。【参考方案3】:
    输入命令行:launchctl unload -w /System/Library/LaunchAgents/com.apple.rcd.plist

【讨论】:

以上是关于在 OS X 上使用 cocos2d 捕获显示(以及 Kiosk 模式问题)?的主要内容,如果未能解决你的问题,请参考以下文章

如何显示抛物线运动以及如何在 Cocos2D 中找到 Sprite 的最终位置 [关闭]

如何在 Mac OS X 10.10 上安装 Java

以编程方式录制声音发送到内置输出,Mac OS X

如何在 NSView (Mac OS X) 上显示徽章

Cocos2d 2.x:我似乎无法更改 3GS 的启动图像!它仍然显示 Cocos2d 橙色默认图像

在 OS X 上使用 AVFoundation AVPlayer 显示字幕