2011-01-15 7 views
5

私はMac用のコードを学習しようとしています。私はしばらくJavaの男でしたので、私が問題になっているのは、Cocoaの単純な誤解です。addGlobalMonitorForEventsMatchingMaskマウス位置を返すだけ

私は、次のコードを持っている:

-(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; 
    } 
} 

これは、マウスのクリックは、グローバルレベルで発生したときに私に言うためのシンプルなフックです。ハンドラは動作していますが、incomingEventの内容は何も設定されていないようです。私が見つけることができる唯一有益な情報は、クリック時のマウスの位置と、クリックされたウィンドウのwindowIdです。

もっと詳しい情報を得ることはできませんか?モニターを正しくセットアップしていませんか?私は本当にどのウィンドウがクリックされたのか知ることができたいと思っていますが、マウスの位置やwindowIdを便利なものに変える方法さえ見つけられません。

答えて

6

あなたは、たとえば、CGWindowのAPI(Leopardで新しい)を使用して、ウィンドウに関する詳細情報を取得できます。

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]; 

の情報がたくさんあります(CGWindow.hで見たり利用できるためのドキュメントを参照してください。キー)。また、1つのウィンドウのスクリーンショットを作成する機能もあります(これは部分的に別のウィンドウで覆われていても機能します)。

+0

はマウスイベントでうまくいきますが、keyDownイベントについて何か知っていますか? –