2011-11-20 22 views
5

¿Cómo puedo obtener el tipo actual de cursor del mouse en la pantalla? (No solo en la ventana de mi aplicación, globalmente). ¿O al menos es posible detectar si el cursor predeterminado se muestra actualmente? O bien Carbon o Cocoa está bien, o incluso otras API activas, preferiblemente las oficiales.¿Cómo obtener el tipo actual de cursor del mouse en Mac OS X?

Esto es lo que he intentado:

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

el cursor no está nil, pero al mismo tiempo no es igual a cualquiera de los otros. Ni siquiera es igual a sí mismo:

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

Ideas? Esta es una aplicación de tipo LSUIElement, si eso es importante.

+0

Este código funciona para mí, independientemente de si la aplicación es una aplicación del agente 'LSUIElement'. –

Respuesta

1

Este es un truco, pero parece que es posible decir lo menos algunos cursores separados mediante la propiedad hotSpot:

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

Esto devuelve {5, 5} para el cursor de puntero por defecto. No tengo idea si este valor cambia para el cursor predeterminado en algunas circunstancias (como mayor DPI o cualquier otra cosa). He terminado con esta categoría en NSCursor:

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

Aparte de eso, hay una variable _flags.cursorType ejemplo, pero que está protegido. Y, como ya lo mencionó, el cursor del sistema actual no tiene que ser ni siquiera -isEqual: consigo mismo.

2

puede comprobar el tipo de cursor actualmente ajustado usando un código similar al siguiente:

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

Los otros valores que se pueden utilizar, en lugar de [NSCursor pointingHandCursor] se enumeran en Retrieving cursor instances.

+0

Y si solo desea capturar el cursor actual, sin compararlo con ningún cursor específico, puede solicitar su imagen al cursor del sistema actual. –

+0

Gracias, buscado varias veces, pero Google nunca me dijo que hay una clase de NSCursor. – Cloudream

+1

Pero obtengo el cursor del sistema con 'NSCursor * sysCursor = [NSCursor currentSystemCursor]' y lo comparo con cada valor posible, ningún tipo es igual, códigos agregados en cuestión. – Cloudream

-1

Debe utilizar currentCursor en lugar de currentSystemCursor, por lo que su declaración sysCursor debe ser algo como esto:

NSCursor *sysCursor = [NSCursor currentCursor]; 

Además, debe comprobar el tipo de cursor después de un clic del usuario y no, p.ej en applicationDidFinishLaunching o similar.

+0

De hecho, ejecuto este código en 'applicationDidFinishLaunching' durante la prueba. Mi aplicación no tiene ventanas (solo un icono en la barra de estado), por lo que 'currentCursor' devuelve nil. – Cloudream

+0

Puede verificar el cursor después de la aplicaciónDidFinishLaunching: usando un NSTimer y llamando a un método específico después de, por ejemplo, un segundo (o después de una cantidad de tiempo menor, puede probar diferentes soluciones). [NSTimer scheduledTimerWithTimeInterval: 1 target: selector automático: @selector (checkCursor) userInfo: nil repeat: NO]; El método sería similar a este: - (void) checkCursor {/ * Compruebe el cursor * /} – Sylter

+1

'currentCursor' se refiere al cursor actual de su aplicación, no al cursor actual en la aplicación activa. –

Cuestiones relacionadas