2012-01-15 74 views
0

我搜索了整個互聯網上的東西沒有運氣。我試圖檢測用戶是否在Mac應用上點擊空格鍵。在Mac上檢測空格鍵事件?

-(void)keyDown:(NSEvent*)theEvent;當用戶按下字符鍵,但沒有輸入或空格時效果很好。

-(BOOL)performKeyEquivalent:(NSEvent *)theEvent;當用戶點擊回車鍵或方向鍵而不是空格鍵時被調用。

任何想法?

回答

0

能得到它的工作通過繼承NSWindow和實施此方法:

- (void)sendEvent:(NSEvent *)theEvent 
{ 
    NSString* keysPressed = [theEvent characters]; 
    if ([keysPressed isEqualToString:@" "]) 
    { 
     if(theEvent.type==NSKeyDown) 
      NSLog(@"spaceDown"); 
     if(theEvent.type==NSKeyUp) 
      NSLog(@"spaceUp"); 
    } 
} 
+0

雖然這個解決方案引起了很多其他問題,因此,如果任何人都知道另一種方式,請分享。 – Snowman 2012-01-16 17:02:14

+0

你有什麼發現? – 2012-12-14 18:27:03

0

您可以根據空格鍵常量使用其他循環與鍵號碼32。

if ([theArrow length] == 1) 
    { 
     keyChar = [theArrow characterAtIndex:0]; 
     NSLog(@"Dentro2 %hu", keyChar); 
     switch (keyChar) 
     { 
      case 32: // Space Bar management 

       break;    
     } 
    } 

    // Manage when any key is dropped. 
    if(downOrUp == FALSE) 
    { 
     NSLog(@"Tecla soltada."); 
     self.playerVelocity = CGPointMake(0.0, 0.0); 
    } 

// Methods to handle key push and key drop 
    - (void)keyDown:(NSEvent *)event 
    { 
     [self handleKeyEvent:event keyDown:YES]; 
    } 

    - (void)keyUp:(NSEvent *)event 
    { 
     [self handleKeyEvent:event keyDown:NO]; 
    } 
+0

如果你#include '那麼你可以使用'kVK_Space'而不是'32'。 – pkamb 2015-06-14 21:20:06

0

我不由自主地絆了一下。奇怪的是,keyDown:事件僅通過moby所述的方法檢測到。但是keyUp:作品像空格鍵按下一個魅力

0

嘗試幾個解決方案後,我帶着一個din't打破其他東西對我來說

@import Carbon; 

typedef void (^CustomWindowSpacebarKeyCallback)(NSEventType eventType); 

@interface CustomWindow : NSWindow 

@property (nonatomic, copy) CustomWindowSpacebarKeyCallback spacebarKeyCallback; 

@end 

@implementation CustomWindow 

- (void) sendEvent:(NSEvent *)theEvent 
{ 
    [super sendEvent:theEvent]; 

    if (([theEvent type] == NSKeyDown || [theEvent type] == NSKeyUp) && _spacebarKeyCallback) { 
     NSString *keysPressed = [theEvent characters]; 
     if ([keysPressed length] == 1) { 
      unichar keyChar = [keysPressed characterAtIndex:0]; 
      if (keyChar == kSpaceCharCode) { 
       _spacebarKeyCallback([theEvent type]); 
      } 
     } 
    } 
} 

@end