2011-11-20 10 views
5

Jak mogę uzyskać bieżący typ kursora myszy na ekranie? (Nie tylko w oknie mojej aplikacji, na całym świecie.) Czy możliwe jest wykrycie, czy domyślny kursor jest aktualnie wyświetlany? Albo węgiel albo kakao jest w porządku - albo nawet inne działające API, najlepiej oficjalne.Jak uzyskać aktualny typ kursora myszy w systemie Mac OS X?

To co próbowałem:

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"); 
} 

Kursor nie jest nil, ale jednocześnie nie jest równa żadnej z pozostałych. Nie jest nawet równa sobie:

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

Pomysły? Jest to aplikacja typu LSUIElement, jeśli to ma znaczenie.

+0

Ten kod działa dla mnie bez względu na to, czy aplikacja jest aplikacją agenta "LSUIElement". –

Odpowiedz

1

Jest to dość hack, ale wygląda na to, że to możliwe, aby powiedzieć co najmniej kilka kursorów od siebie za pomocą właściwości hotSpot:

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

ta zwraca {5, 5} dla kursora domyślnego wskaźnika. Nie mam pojęcia, czy ta wartość zmienia się dla domyślnego kursora w pewnych okolicznościach (jak wyższa DPI lub cokolwiek innego). I skończyło się na NSCursor tej kategorii:

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

Poza tym, istnieje zmienna _flags.cursorType instancji, ale który jest chroniony. I, jak już wspomniano, bieżący kursor systemowy nie musi być sam w sobie równy -isEqual:.

2

Można sprawdzić typ kursora aktualnie ustawiony przy użyciu kodu podobnego do następującego:

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

Inne wartości można użyć zamiast [NSCursor pointingHandCursor] są wymienione w Retrieving cursor instances.

+0

A jeśli chcesz tylko uchwycić bieżący kursor, nie porównując go z żadnym konkretnym kursorem, możesz poprosić bieżący kursor systemowy o jego obraz. –

+0

Dziękuję, przeszukano kilka razy, ale Google nigdy nie powiedział mi, że istnieje klasa NSCursor. – Cloudream

+1

Ale dostaję kursor systemowy z 'NSCursor * sysCursor = [NSCursor currentSystemCursor]' i porównaj z każdą możliwą wartością, żaden typ nie jest równy, kody dodane w pytaniu. – Cloudream

-1

Należy użyć currentCursor zamiast currentSystemCursor, więc deklaracja sysCursor powinno być coś takiego:

NSCursor *sysCursor = [NSCursor currentCursor]; 

Ponadto należy sprawdzić typ kursora po kliknięciu przez użytkownika, a nie, na przykład w applicationDidFinishLaunching lub podobnym.

+0

W rzeczywistości uruchamiam ten kod w 'applicationDidFinishLaunching' podczas testowania. Moja aplikacja jest pozbawiona okien (tylko ikona na pasku stanu), więc 'currentCursor' zwraca zero. – Cloudream

+0

Możesz sprawdzić kursor po applicationDidFinishLaunching: używając NSTimer i wywołując określoną metodę po, na przykład, sekundę (lub po mniejszej ilości czasu, możesz wypróbować różne rozwiązania). [NSTimer scheduledTimerWithTimeInterval: 1 target: self selektor: @selector (checkCursor) userInfo: zero powtarza: NO]; Metoda będzie podobna do tej: - (void) checkCursor {/ * Sprawdź kursor * /} – Sylter

+1

'currentCursor' odnosi się do bieżącego kursora aplikacji, a nie do bieżącego kursora w aktywnej aplikacji. –

Powiązane problemy