如何在Mac OS X中获取当前类型的鼠标光标?

时间:2011-11-20 00:06:34

标签: macos cocoa cursor mouse macos-carbon

如何在屏幕上显示当前类型的鼠标光标? (不仅在我的应用程序窗口,全局。)或者至少可以检测当前是否显示默认光标?无论是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类型的应用,如果重要的话。

4 个答案:

答案 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或类似。