1

我用 cocos2d 为 Mac 构建了一个应用程序,并实现了Apple 为 Kiosk 应用程序推荐的步骤。我的目标是拥有一个不允许退出应用程序并捕获所有键盘输入的全屏应用程序。

问题是,在扩展键盘上,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 编程说明,解决方案似乎是“捕获显示” 。当您捕获显示时,应用程序会拦截所有键盘输入,并且不会将任何键盘输入进一步发送到系统。这一切都很好,我已经能够在香草应用程序中做到这一点。

CCGLView.m然而,在我的 cocos2d OS X 应用程序中,OpenGL 和 GLView 的控制是在几个核心 cocos2d 文件中处理的,即CCDirectorMac.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 元素,例如菜单栏和 Dock。

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

4

3 回答 3

0

切换fn和普通键功能:

  • 系统偏好
  • 键盘
  • 使能够Use all F1, F2, etc. keys as normal keys

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

于 2013-01-18T20:35:42.440 回答
0

您可能需要查看 CarbonEvents.h 以获取有关使用PushSymbolicHotKeyMode/ PopSymbolicHotKeyModewith的信息kHIHotKeyModeAllDisabled

于 2013-01-19T07:26:33.643 回答
-2
  1. 进入命令行:launchctl unload -w /System/Library/LaunchAgents/com.apple.rcd.plist
于 2017-01-26T20:05:27.337 回答