Как получить текущий тип курсора мыши в Mac OS X? - PullRequest
5 голосов
/ 20 ноября 2011

Как я могу получить текущий тип курсора мыши на экране? (Не только в моем окне приложения, глобально.) Или, по крайней мере, возможно определить, отображается ли курсор по умолчанию в настоящее время? Либо с Carbon, либо с Cocoa - или с другими работающими 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 ]

2 голосов
/ 20 ноября 2011

Вы можете проверить тип курсора, установленный в данный момент, используя код, подобный следующему:

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

Другие значения, которые вы можете использовать вместо [NSCursor pointingHandCursor], перечислены в Получение экземпляров курсора .

1 голос
/ 17 сентября 2013

Это довольно много, но похоже, что можно выделить хотя бы несколько курсоров, используя свойство 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: с самим собой.

0 голосов
/ 11 апреля 2018

Вы можете сравнить изображения курсора. isEqual не будет работать для этого, вам нужно получить данные растрового изображения и сравнить их.

0 голосов
/ 20 ноября 2011

Вы должны использовать currentCursor вместо currentSystemCursor , поэтому ваше объявление sysCursor должно выглядеть примерно так:

NSCursor *sysCursor = [NSCursor currentCursor];

Кроме того, вы должны проверить типкурсора после щелчка пользователя, а не, например, в applicationDidFinishLaunching или аналогичном.

...