【发布时间】: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.m 和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 元素,例如菜单栏和 码头。
尽管如此,当您捕获显示时,媒体/iTunes/音量功能键不会被拦截,这是我在写这个问题时试图回答的问题的一部分。我向 Apple 提出了技术支持问题,因为似乎无法禁用它们。
【问题讨论】:
-
我无法提供答案,所以我想在评论中提出建议 - 试试ambrosiasw.com/utilities/snapzprox,它允许您设置录制屏幕的方式、地点和时间。希望您能找到更好的解决方案!
-
我想你误解了我所说的捕获显示的意思。我不是要截屏。根据 Apple 提供的定义,我正在尝试“捕获”它:developer.apple.com/library/mac/#documentation/graphicsimaging/…
标签: macos cocos2d-iphone kiosk