2011-11-20 9 views
5

Come posso ottenere il tipo corrente di cursore del mouse sullo schermo? (Non solo sulla mia finestra dell'app, a livello globale.) O è almeno possibile rilevare se il cursore predefinito è attualmente visualizzato? O Carbon o Cocoa è OK - o anche altre API di lavoro, preferibilmente quelle ufficiali.Come ottenere il tipo corrente di cursore del mouse in Mac OS X?

Questo è quello che ho provato:

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

il cursore non è nil, ma allo stesso tempo non è uguale a tutti gli altri. Non è nemmeno uguale a se stesso:

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

Idee? Questa è un'app di tipo LSUIElement, se questo è importante.

+0

Questo codice funziona per me indipendentemente dal fatto che l'app sia un'app dell'agente 'LSUIElement'. –

risposta

1

questo è piuttosto un hack, ma sembra che sia possibile dire almeno alcuni cursori a parte utilizzando la proprietà hotSpot:

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

Questo restituisce {5, 5} per il cursore puntatore predefinito. Non ho idea se questo valore cambia per il cursore predefinito in alcune circostanze (come DPI più alti o qualsiasi altra cosa). Ho finito con questa categoria su NSCursor:

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

Oltre a questo, c'è una variabile _flags.cursorType esempio, ma questo è protetta. E, come hai già detto, il cursore di sistema corrente non deve essere pari a -isEqual: con se stesso.

2

È possibile controllare il tipo di cursore attualmente impostato utilizzando il codice simile al seguente:

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

Gli altri valori che è possibile utilizzare, al posto di [NSCursor pointingHandCursor] sono elencati in Retrieving cursor instances.

+0

E se vuoi solo catturare il cursore corrente, senza confrontarlo con un cursore specifico, puoi chiedere al cursore di sistema corrente la sua immagine. –

+0

Grazie, ho cercato più volte ma Google non mi ha mai detto che esiste una classe NSCursor. – Cloudream

+1

Ma ho il cursore di sistema con 'NSCursor * sysCursor = [NSCursor currentSystemCursor]' e confronto con ogni valore possibile, nessun tipo è eguagliato, codici aggiunti in questione. – Cloudream

-1

Si dovrebbe usare currentCursor invece di currentSystemCursor, quindi la tua dichiarazione sysCursor dovrebbe essere qualcosa di simile:

NSCursor *sysCursor = [NSCursor currentCursor]; 

Inoltre, si dovrebbe verificare il tipo di cursore dopo un clic dell'utente e non, per esempio in applicationDidFinishLaunching o simile.

+0

In effetti eseguo questo codice in 'applicationDidFinishLaunching' durante il test. La mia app è senza finestre (solo un'icona nella barra di stato), quindi 'currentCursor' restituisce nil. – Cloudream

+0

È possibile controllare il cursore dopo applicationDidFinishLaunching: utilizzando un NSTimer e chiamando un metodo specifico dopo, ad esempio, un secondo (o dopo un periodo di tempo minore, è possibile provare soluzioni diverse). [NSTimer scheduledTimerWithTimeInterval: 1 target: self selector: @selector (checkCursor) userInfo: nil ripetizioni: NO]; Il metodo sarebbe simile a questo: - (vuoto) checkCursor {/ * Controllare il cursore * /} – Sylter

+1

'currentCursor' fa riferimento al cursore corrente dell'applicazione, non al cursore corrente nell'applicazione attiva. –

Problemi correlati