2012-11-08 46 views
1

我爲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.mCCDirectorMac.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的/音量功能鍵不拍照時顯示,這是我想回答時,我寫了這個問題,這個問題的一部分攔截。我向蘋果提交了一個技術支持問題,因爲看起來不可能禁用它們。

+0

我不能提供一個答案,所以我希望在這裏發表評論 - 嘗試http://www.ambrosiasw.com/utilities/snapzprox/,它允許您設置如何記錄屏幕的位置和時間。我希望你找到更好的解決方案! – DrM

+0

我認爲你誤解我的意思是捕獲顯示。我沒有試圖截圖。我試圖根據Apple提供的這個定義來「捕獲」它:https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/QuartzDisplayServicesConceptual/Articles/DisplayCapture.html – Clay

回答

0

交換機的FN和正常的關鍵功能:

  • 系統偏好
  • 鍵盤
  • 使Use all F1, F2, etc. keys as normal keys

然後,您可以使用普通的˚F功能(音量提高,音量降)與fn + F12並捕獲正常的F鍵。

+0

我知道的能力,但我不希望每個人都使用我試圖通過這些步驟所做的軟件。我只是想以與cocos2d集成的方式捕捉屏幕。 – Clay

0

您可能想查看CarbonEvents.h以獲取有關使用PushSymbolicHotKeyMode/PopSymbolicHotKeyModekHIHotKeyModeAllDisabled的信息。

+0

謝謝。我記得幾個月前看過,但結果並不是我所需要的,儘管我不記得爲什麼。我會再看一次。 – Clay

-2
  • 輸入命令行:launchctl卸載-w /System/Library/LaunchAgents/com.apple.rcd.plist