我使用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.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]];
}
如何捕捉显示屏(注意:这与截屏截图不同!) in cocos2d 并阻止功能键与除了我的申请?
其他信息: -enterFullScreenMode:withOptions:
会捕获显示内容,但前提是您没有作为其中一个选项发送NSFullScreenModeApplicationPresentationOptions
。 Apple文档在NSView和Kiosk模式文档中指定了这一点:
当您传递给选项词典时
enterFullScreenMode:withOptions:
确实包含值NSFullScreenModeApplicationPresentationOptions
,AppKit没有 捕获任何显示,因为这样做会阻止显示 presentationOptions控制的UI元素,如菜单栏和 基座。
然而,当您捕获显示时,媒体/ iTunes /音量功能键不会被拦截,这是我在撰写此问题时试图回答的问题的一部分。我向Apple提交了技术支持问题,因为它似乎无法禁用它们。
答案 0 :(得分:0)
切换 fn 和普通键功能:
Use all F1, F2, etc. keys as normal keys
然后,您可以使用 fn + F12 访问正常的 F 功能(音量增大,音量减小)并捕获正常的{{1密钥。
答案 1 :(得分:0)
您可以查看CarbonEvents.h,了解有关将PushSymbolicHotKeyMode
/ PopSymbolicHotKeyMode
与kHIHotKeyModeAllDisabled
一起使用的信息。
答案 2 :(得分:-2)