繁体   English   中英

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

[英]How to get current type of mouse cursor in Mac OS X?

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

您可以使用类似于以下代码的代码检查当前设置的光标类型:

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

检索游标实例中列出了您可以使用的其他值,而不是[NSCursor pointingHandCursor]

这是一个非常黑客,但看起来可以使用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:自身。

您可以比较光标图像。 isEqual不适用于此,您必须获取位图图像数据并进行比较。

你应该使用currentCursor而不是currentSystemCursor ,所以你的sysCursor声明应该是这样的:

NSCursor *sysCursor = [NSCursor currentCursor];

此外,您应该在用户单击后检查光标的类型,而不是,例如在applicationDidFinishLaunching或类似的情况下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM