如何在屏幕上显示当前类型的鼠标光标? (不仅在我的应用程序窗口,全局。)或者至少可以检测当前是否显示默认光标?无论是Carbon还是Cocoa都可以 - 甚至是其他工作API,最好是官方API。
这就是我的尝试:
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");
}
光标不是nil
,但同时它不等于任何其他光标。它甚至不等于它自己:
NSLog(@"%i", [[NSCursor currentSystemCursor]
isEqual:[NSCursor currentSystemCursor]]); // 0
想法?这是一个LSUIElement
类型的应用,如果重要的话。
答案 0 :(得分:2)
您可以使用类似下面的代码检查当前设置的光标类型:
if ([[NSCursor currentSystemCursor] isEqual: [NSCursor pointingHandCursor]]) {
// …
}
Retrieving cursor instances中列出了您可以使用的其他值,而不是[NSCursor pointingHandCursor]
。
答案 1 :(得分:1)
这是一个非常黑客的问题,但看起来可以使用hotSpot
属性来区分至少一些游标:
NSLog(@"%@", NSStringFromPoint([[NSCursor currentSystemCursor] hotSpot]));
这将返回{5, 5}
作为默认指针光标。在某些情况下(比如更高的DPI或其他任何情况),我不知道这个值是否会更改为默认光标。我最终在NSCursor
上找到了这个类别:
- (BOOL) isDefaultCursor
{
NSPoint defaultCursorHotspot = [[NSCursor arrowCursor] hotSpot];
return NSEqualPoints(defaultCursorHotspot, [self hotSpot]);
}
除此之外,还有一个_flags.cursorType
实例变量,但它受到保护。而且,正如您已经提到的,当前系统游标不必与其自身-isEqual:
。
答案 2 :(得分:0)
您可以比较光标图像。 isEqual不会为此工作,你必须得到位图图像数据并进行比较。
答案 3 :(得分:-1)
您应该使用 currentCursor 而不是 currentSystemCursor ,因此您的sysCursor声明应该是这样的:
NSCursor *sysCursor = [NSCursor currentCursor];
此外,您应该在用户点击后检查光标类型,而不是,例如在applicationDidFinishLaunching或类似。