2011-01-15 19 views
5

Mac için kod yazmayı öğreniyorum. Bir süredir bir Java adamım, bu yüzden yaşadığım problemin Kakao'nun basit bir yanlış anlaşılması olduğunu umuyorum.addGlobalMonitorForEventsMatchingMask yalnızca dönen fare konumu

-(IBAction)beginEventMonitor:(id)sender { 
    _eventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseUpMask) 
    handler:^(NSEvent *incomingEvent) { 
    //NSWindow *targetWindowForEvent = [incomingEvent window]; 
    NSLog(@"Got a mouse click event at %@", NSStringFromPoint([incomingEvent locationInWindow])); 
    }]; 
} 

-(IBAction)stopEventMonitor:(id)sender { 
    if (_eventMonitor) { 
    [NSEvent removeMonitor:_eventMonitor]; 
    _eventMonitor = nil; 
    } 
} 

Bu fare tıklaması küresel düzeyde meydana geldiğinde söyle basit kanca:

Aşağıdaki kodu var. İşleyici çalışıyor, ancak gelenEvent'in içeriği hiçbir şeye ayarlanmış gibi görünmüyor. Bulabildiğim tek yararlı bilgiler, tıklatıldığında farenin yeri ve tıklatılan pencerenin windowId öğesidir.

Daha fazla bilgi edinememeli miyim? Monitörü doğru şekilde kurmuyor muyum? Hangi pencerenin tıklandığından emin olmak isterdim, ancak fare konumunu veya penceresini kullanışlı bir şeye dönüştürmenin bir yolunu bile bulamıyorum.

cevap

6
Örneğin (Leopard'daki yeni) CGWindow API'leri kullanarak penceresi hakkında daha fazla bilgi, alabilirsiniz

:

CGWindowID windowID = (CGWindowID)[incomingEvent windowNumber]; 
CFArrayRef a = CFArrayCreate(NULL, (void *)&windowID, 1, NULL); 
NSArray *windowInfos = (NSArray *)CGWindowListCreateDescriptionFromArray(a); 
CFRelease(a); 
if ([windowInfos count] > 0) { 
    NSDictionary *windowInfo = [windowInfos objectAtIndex:0]; 
    NSLog(@"Name: %@", [windowInfo objectForKey:(NSString *)kCGWindowName]); 
    NSLog(@"Owner: %@", [windowInfo objectForKey:(NSString *)kCGWindowOwnerName]); 
    //etc. 
} 
[windowInfos release]; 

orada pek çok bilgi var (CGWindow.h bakın veya mevcut için dokümanlar bakın anahtarlar). Sadece bir pencere (başka bir pencere tarafından kısmen kaplanmış olsa bile) ekran görüntüleri oluşturmak için fonksiyonlar da vardır, harika şeyler!

+0

fare olaylarıyla harika çalışıyor, keyDown olayları için bir şeyler biliyor musunuz? –