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

时间:2012-11-08 14:49:24

标签: macos cocos2d-iphone kiosk

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

问题在于,在扩展键盘上,Kiosk模式不会捕获控制iTunes或F4 Launchpad键的功能键。禁用进程切换后,用户仍然可以通过按F4切换进程。 (我在此提交了一个Radar,因为它应该在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]];
}

如何捕捉显示屏(注意:这与截屏截图不同!) in cocos2d 并阻止功能键与除了我的申请?


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

  

当您传递给选项词典时   enterFullScreenMode:withOptions:确实包含值   NSFullScreenModeApplicationPresentationOptions,AppKit没有   捕获任何显示,因为这样做会阻止显示   presentationOptions控制的UI元素,如菜单栏和   基座。

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

3 个答案:

答案 0 :(得分:0)

切换 fn 和普通键功能:

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

然后,您可以使用 fn + F12 访问正常的 F 功能(音量增大,音量减小)并捕获正常的{{1密钥。

答案 1 :(得分:0)

您可以查看CarbonEvents.h,了解有关将PushSymbolicHotKeyMode / PopSymbolicHotKeyModekHIHotKeyModeAllDisabled一起使用的信息。

答案 2 :(得分:-2)

  1. 输入命令行:launchctl unload -w /System/Library/LaunchAgents/com.apple.rcd.plist