2011-11-20 24 views
5

Làm cách nào để có được loại con trỏ chuột hiện tại trên màn hình? (Không chỉ trên cửa sổ ứng dụng của tôi, trên toàn cầu.) Hoặc ít nhất có thể phát hiện xem con trỏ mặc định có được hiển thị không? Hoặc Carbon hoặc Ca cao là OK - hoặc thậm chí là các API hoạt động khác, tốt nhất là các API chính thức.Cách lấy loại con trỏ chuột hiện tại trong Mac OS X?

Đây là những gì tôi đã cố gắng:

NSCursor *sysCursor = [NSCursor currentSystemCursor]; 

if (sysCursor == nil) { 
    NSLog(@"nil"); 
} 

if ([sysCursor isEqual: [NSCursor arrowCursor]] || 
    [sysCursor isEqual: [NSCursor contextualMenuCursor]] || 
    [sysCursor isEqual: [NSCursor closedHandCursor]] || 
    [sysCursor isEqual: [NSCursor crosshairCursor]] || 
    [sysCursor isEqual: [NSCursor disappearingItemCursor]] || 
    [sysCursor isEqual: [NSCursor dragCopyCursor]] || 
    [sysCursor isEqual: [NSCursor dragLinkCursor]] || 
    [sysCursor isEqual: [NSCursor IBeamCursor]] || 
    [sysCursor isEqual: [NSCursor openHandCursor]] || 
    [sysCursor isEqual: [NSCursor operationNotAllowedCursor]] || 
    [sysCursor isEqual: [NSCursor pointingHandCursor]] || 
    [sysCursor isEqual: [NSCursor resizeDownCursor]] || 
    [sysCursor isEqual: [NSCursor resizeLeftCursor]] || 
    [sysCursor isEqual: [NSCursor resizeLeftRightCursor]] || 
    [sysCursor isEqual: [NSCursor resizeRightCursor]] || 
    [sysCursor isEqual: [NSCursor resizeUpCursor]] || 
    [sysCursor isEqual: [NSCursor resizeUpDownCursor]] || 
    [sysCursor isEqual: [NSCursor IBeamCursorForVerticalLayout]] 
    ) { 
    NSLog(@"equal"); 
} else { 
    NSLog(@"not"); 
} 

Con trỏ không phải là nil, nhưng đồng thời nó không phải bằng bất kỳ của những người khác. Nó thậm chí không bằng với chính nó:

NSLog(@"%i", [[NSCursor currentSystemCursor] 
    isEqual:[NSCursor currentSystemCursor]]); // 0 

Ý tưởng? Đây là ứng dụng kiểu LSUIElement, nếu điều đó quan trọng.

+0

Mã này hoạt động cho tôi cho dù ứng dụng có phải là ứng dụng đại lý 'LSUIElement' hay không. –

Trả lời

1

này là khá một hack, nhưng có vẻ như nó có thể nói ít nhất một số con trỏ ngoài bằng cách sử dụng hotSpot tài sản:

NSLog(@"%@", NSStringFromPoint([[NSCursor currentSystemCursor] hotSpot])); 

này trả {5, 5} cho con trỏ trỏ mặc định. Tôi không có ý tưởng nếu giá trị này thay đổi cho con trỏ mặc định trong một số trường hợp (như DPI cao hơn hoặc bất cứ điều gì khác). Tôi đã kết thúc với thể loại này trên NSCursor:

- (BOOL) isDefaultCursor 
{ 
    NSPoint defaultCursorHotspot = [[NSCursor arrowCursor] hotSpot]; 
    return NSEqualPoints(defaultCursorHotspot, [self hotSpot]); 
} 

Ngoài ra, có một biến _flags.cursorType dụ, nhưng đó là bảo vệ. Và, như bạn đã đề cập, con trỏ hệ thống hiện tại không phải là ngay cả -isEqual: với chính nó.

2

Bạn có thể kiểm tra các loại con trỏ hiện thiết lập sử dụng mã tương tự như sau một:

if ([[NSCursor currentSystemCursor] isEqual: [NSCursor pointingHandCursor]]) { 
    // … 
} 

Các giá trị khác mà bạn có thể sử dụng, thay vì [NSCursor pointingHandCursor] được liệt kê trong Retrieving cursor instances.

+0

Và nếu bạn chỉ muốn chụp con trỏ hiện tại, mà không cần so sánh con trỏ đó với bất kỳ con trỏ cụ thể nào, thì bạn có thể hỏi con trỏ hệ thống hiện tại cho hình ảnh của nó. –

+0

Cảm ơn bạn, đã tìm kiếm nhiều lần nhưng Google chưa bao giờ nói với tôi rằng có một lớp NSCursor. – Cloudream

+1

Nhưng tôi nhận con trỏ hệ thống với 'NSCursor * sysCursor = [NSCursor currentSystemCursor]' và so sánh với mọi giá trị có thể, không có kiểu nào được cân bằng, mã được thêm vào trong câu hỏi. – Cloudream

-1

Bạn nên sử dụng currentCursor thay vì currentSystemCursor, vì vậy khai sysCursor của bạn nên được một cái gì đó như thế này:

NSCursor *sysCursor = [NSCursor currentCursor]; 

Bên cạnh đó, bạn nên kiểm tra các loại con trỏ sau khi người dùng nhấp chuột và không, ví dụ trong applicationDidFinishLaunching hoặc tương tự.

+0

Trong thực tế, tôi chạy mã này trong 'applicationDidFinishLaunching' khi thử nghiệm. Ứng dụng của tôi không cửa sổ (chỉ có một biểu tượng trong thanh trạng thái), do đó, 'currentCursor' trả về nil. – Cloudream

+0

Bạn có thể kiểm tra con trỏ sau khi applicationDidFinishLaunching: sử dụng NSTimer và gọi một phương thức cụ thể sau, ví dụ, một giây (hoặc sau một khoảng thời gian ít hơn, bạn có thể thử các giải pháp khác nhau). [NSTimer scheduleTimerWithTimeInterval: 1 target: tự chọn: @selector (checkCursor) userInfo: nil repeats: NO]; Phương pháp sẽ tương tự như sau: - (void) checkCursor {/ * Kiểm tra con trỏ * /} – Sylter

+1

'currentCursor' là con trỏ hiện tại của ứng dụng của bạn, không phải con trỏ hiện tại trong ứng dụng đang hoạt động. –