How can I get the current type of mouse cursor on screen? (Not only on my app window, globally.) Or is it at least possible to detect whether the default cursor is currently displayed? Either Carbon or Cocoa is OK – or even other working APIs, preferably the official ones.
This is what I have tried:
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");
}
The cursor is not nil
, but at the same time it’s not equal to any of the others. It’s not even equal to itself:
NSLog(@"%i", [[NSCursor currentSystemCursor]
isEqual:[NSCursor currentSystemCursor]]); // 0
Ideas? This is a LSUIElement
-type app, if that matters.
You can check the cursor type currently set using code similar to the following one:
if ([[NSCursor currentSystemCursor] isEqual: [NSCursor pointingHandCursor]]) {
// …
}
The other values you can use, instead of [NSCursor pointingHandCursor]
are listed in Retrieving cursor instances.
This is quite a hack, but it looks like it’s possible to tell at least some cursors apart using the hotSpot
property:
NSLog(@"%@", NSStringFromPoint([[NSCursor currentSystemCursor] hotSpot]));
This returns {5, 5}
for the default pointer cursor. I have no idea if this value changes for the default cursor under some circumstances (like higher DPI or whatever else). I have ended up with this category on NSCursor
:
- (BOOL) isDefaultCursor
{
NSPoint defaultCursorHotspot = [[NSCursor arrowCursor] hotSpot];
return NSEqualPoints(defaultCursorHotspot, [self hotSpot]);
}
Other than that, there’s a _flags.cursorType
instance variable, but that’s protected. And, as you already mentioned, the current system cursor does not have to be even -isEqual:
with itself.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With