我爲Mac構建了一個包含cocos2d的應用程序,並實施了Apple's recommended steps for a Kiosk application。我的目標是有一個全屏應用程序,禁止退出應用程序並捕獲所有鍵盤輸入。在OS X(和Kiosk模式問題)上使用cocos2d捕獲顯示?
問題是,在擴展鍵盤上,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
發送作爲選項之一。蘋果文檔的一個NSView和Kiosk模式文檔中指定此:
當選項字典傳遞給
enterFullScreenMode:withOptions:
不包含NSFullScreenModeApplicationPresentationOptions
值,AppKit的不 捕獲任何顯示器,因爲這樣做會阻止顯示 presentationOptions控制的用戶界面元素,如菜單欄和 Dock。
儘管如此,媒體/ iTunes的/音量功能鍵不拍照時顯示,這是我想回答時,我寫了這個問題,這個問題的一部分攔截。我向蘋果提交了一個技術支持問題,因爲看起來不可能禁用它們。
我不能提供一個答案,所以我希望在這裏發表評論 - 嘗試http://www.ambrosiasw.com/utilities/snapzprox/,它允許您設置如何記錄屏幕的位置和時間。我希望你找到更好的解決方案! – DrM
我認爲你誤解我的意思是捕獲顯示。我沒有試圖截圖。我試圖根據Apple提供的這個定義來「捕獲」它:https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/QuartzDisplayServicesConceptual/Articles/DisplayCapture.html – Clay