Mac用のcocos2dを使用してアプリを作成し、キオスクアプリケーション用にAppleが推奨する手順を実装しました。私の目標は、アプリケーションの終了を禁止し、すべてのキーボード入力をキャプチャするフルスクリーンアプリケーションを作成することです。
問題は、拡張キーボードでは、キオスクモードがiTunesまたはF4Launchpadキーを制御するファンクションキーをキャプチャしないことです。プロセス切り替えを無効にしても、ユーザーはF4を押してプロセスを切り替えることができます。(キオスクモードでは許可されないはずなので、これについてレーダーを提出しました。)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プログラミングノートによると「ディスプレイをキャプチャする」ことのようです。ディスプレイをキャプチャすると、すべてのキーボード入力がアプリケーションによってインターセプトされ、システムにディスパッチされるものはありません。それはすべてうまくいっていて、私はバニラアプリケーションでそれを行うことができました。
しかし、私のcocos2d OS Xアプリでは、OpenGLとGLViewの制御は、いくつかのコアcocos2dファイル、つまり、で処理されCCGLView.mますCCDirectorMac.m。表示をキャプチャするためにこれらのファイルを調整するのに何時間も費やしましたが、それを機能させることができませんでした。
参考までに、これは私がAppDelegate.mキオスクモードに入るために(で)行っていることです:
- (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:表示をキャプチャしますが、オプションの1つとして送信しない場合に限りNSFullScreenModeApplicationPresentationOptionsます。Appleのドキュメントでは、NSViewおよびKioskモードのドキュメントでこれを指定しています。
渡すオプションディクショナリに
enterFullScreenMode:withOptions:の値が含まれている場合NSFullScreenModeApplicationPresentationOptions、AppKitは表示をキャプチャしません。これを行うと、メニューバーやDockなどのpresentationOptionsで制御されるUI要素が表示されなくなるためです。
それにもかかわらず、ディスプレイをキャプチャするときにメディア/ iTunes /ボリュームファンクションキーが傍受されません。これは、この質問を書いたときに答えようとしていた問題の一部です。Appleにテクニカルサポートの質問を提出したのは、それらを無効にすることができないように思われるためです。