2011-01-15 42 views
5

Tôi đang cố gắng tìm hiểu mã cho Mac. Tôi đã là một anh chàng Java trong một thời gian, vì vậy tôi hy vọng vấn đề tôi đang gặp phải là một sự hiểu lầm đơn giản về Cocoa.addGlobalMonitorForEventsMatchingMask chỉ trả lại vị trí chuột

Tôi đã có đoạn mã sau:

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

Đây là một cái móc đơn giản để cho tôi biết khi một click chuột xảy ra ở mức độ toàn cầu. Trình xử lý đang làm việc, nhưng nội dung của incomingEvent dường như không được đặt thành bất cứ thứ gì. Thông tin hữu ích duy nhất mà tôi có thể tìm thấy là vị trí của con chuột tại thời điểm nhấp chuột và cửa sổId của cửa sổ được nhấp vào.

Tôi không thể có thêm thông tin? Tôi có không thiết lập đúng màn hình không? Tôi thực sự muốn có thể biết được cửa sổ nào đã được nhấp vào, nhưng tôi thậm chí không thể tìm thấy một cách để biến vị trí chuột hoặc windowId thành một cái gì đó hữu ích.

Trả lời

6

Bạn có thể lấy thêm thông tin về các cửa sổ bằng cách sử dụng CGWindow API (mới trong Leopard), ví dụ:

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

Có rất nhiều thông tin có (nhìn vào CGWindow.h hoặc tham khảo các tài liệu cho sẵn phím). Ngoài ra còn có các chức năng để tạo ảnh chụp màn hình của chỉ một cửa sổ (mà thậm chí hoạt động nếu nó được che một phần bởi một cửa sổ khác), những thứ tuyệt vời!

+0

hoạt động tốt với sự kiện chuột, bạn có biết điều gì đó cho sự kiện keyDown không? –

Các vấn đề liên quan