2010-02-14 42 views
15

Làm cách nào để vào vị trí chuột "toàn cầu" của Mac OS X - ý tôi là làm thế nào tôi có thể tìm thấy vị trí con trỏ ngay cả khi nó nằm ngoài cửa sổ và ngay cả khi cửa sổ của tôi không hoạt động?Vị trí chuột "toàn cầu" trong Mac OS X

Tôi biết đó là bằng cách nào đó có thể (thậm chí không có quyền admin), bởi vì tôi đã nhìn thấy một cái gì đó như thế trong Java - nhưng tôi muốn viết nó trong ObjC

Xin lỗi vì tiếng Anh của tôi - Tôi hy vọng bạn sẽ hiểu những gì tôi có ý nghĩa;)

+0

có thể trùng lặp của http://stackoverflow.com/questions/1117065/cocoa-getting-the-current-mouse-position-on-the-screen – outis

Trả lời

27
NSPoint mouseLoc; 
mouseLoc = [NSEvent mouseLocation]; //get current mouse position 
NSLog(@"Mouse location: %f %f", mouseLoc.x, mouseLoc.y); 

Nếu bạn muốn nó liên tục nhận được các tọa độ sau đó hãy chắc chắn rằng bạn có một NSTimer hoặc một cái gì đó tương tự

+0

wow, cảm ơn! Tôi không biết nó đơn giản như thế. Tôi nghĩ NSEvent sẽ chỉ cho tôi vị trí chuột trong cửa sổ. Tôi sẽ chấp nhận câu trả lời của bạn, sau khi tôi sẽ kiểm tra nó hoạt động theo cách tôi muốn. – radex

+0

Cảm ơn. Có cách nào để tìm ra màn hình là con chuột nằm trong? – adib

+1

@adib - sử dụng [màn hình NSScreen] và lặp qua kết quả, sử dụng NSPointInRect để kiểm tra –

29

Matt S. là đúng rằng nếu bạn có thể sử dụng NSEvent API để có được vị trí chuột. Tuy nhiên, bạn không phải thăm dò ý kiến ​​để liên tục nhận tọa độ. Bạn có thể sử dụng một CGEventTap thay vì:

- (void) startEventTap { 
    //eventTap is an ivar on this class of type CFMachPortRef 
    eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionListenOnly, kCGEventMaskForAllEvents, myCGEventCallback, NULL); 
    CGEventTapEnable(eventTap, true); 
} 

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) { 
    if (type == kCGEventMouseMoved) { 
     NSLog(@"%@", NSStringFromPoint([NSEvent mouseLocation])); 
    } 

    return event; 
} 

Bằng cách này, chức năng của bạn myCGEventCallback sẽ cháy mỗi khi di chuyển chuột (bất kể ứng dụng của bạn là frontmost hay không), mà không cần phải thăm dò ý kiến ​​cho các thông tin. Đừng quên CGEventTapEnable(eventTap, false)CFRelease(eventTap) khi bạn hoàn tất.

+1

Tôi thích phương pháp này :) tốt hơn nhiều sau đó tôi –

+0

Nó không làm việc cho tôi: (Tôi không có ý tưởng tại sao, không có đầu ra xuất hiện. – radex

+0

ok, không bao giờ tâm trí. Giải pháp của bạn có lẽ là tốt hơn, nhưng nó không hoạt động. Tôi sẽ chỉ sử dụng [NSEvent mouseLocation];) Thanks anyway – radex

6

Nếu bạn đang không ở trong đất cacao và một vòi kiện không thích hợp cho tình hình,

CGEventRef event = CGEventCreate(nil); 
CGPoint loc = CGEventGetLocation(event); 
CFRelease(event); 

công trình.

2

Matt là chính xác, nhưng để liên tục nhận được tọa độ, tôi tin rằng tùy chọn khác là sử dụng màn hình sự kiện được cung cấp bởi NSEvent. Hãy thử addGlobalMonitorForEventsMatchingMask:handler:addLocalMonitorForEventsMatchingMask:handler:. Kiểm tra NSEvent Class Reference để biết thêm chi tiết.