2011-11-20 79 views
5

如何在屏幕上顯示鼠標光標的當前類型? (不僅在我的應用程序窗口,全局。)或者至少可以檢測當前是否顯示默認光標?無論是碳還是可可都可以 - 甚至是其他工作的API,最好是官方的。如何在Mac OS X中獲取當前類型的鼠標光標?

這是我曾嘗試:

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

此代碼適用於我,無論該應用程序是否爲「LSUIElement」代理應用程序。 –

回答

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

您可以檢查當前使用相似的代碼下面一個設置光標類型:

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

,你可以用其他的值,而不是在[NSCursor pointingHandCursor]Retrieving cursor instances上市。

+0

如果您只想捕獲當前光標,而不將其與任何特定光標進行比較,則可以詢問當前系統光標是否存在其圖像。 –

+0

謝謝你,多次搜索,但谷歌沒有告訴我有一個NSCursor類。 – Cloudream

+1

但是我用'NSCursor * sysCursor = [NSCursor currentSystemCursor]'得到系統遊標,並與每個可能的值進行比較,沒有類型相等,代碼添加有問題。 – Cloudream

-1

您應該使用currentCursor,而不是currentSystemCursor,所以你sysCursor聲明應該是這樣的:

NSCursor *sysCursor = [NSCursor currentCursor]; 

此外,你應該在用戶點擊後檢查遊標類型,而不是,例如在applicationDidFinishLaunching或類似的。

+0

實際上,我在測試時在'applicationDidFinishLaunching'中運行這段代碼。我的應用程序是無窗口的(只有狀態欄中的圖標),所以'currentCursor'返回nil。 – Cloudream

+0

您可以在applicationDidFinishLaunching之後檢查遊標:使用NSTimer並在例如第二秒之後(或者在較少時間之後,您可以嘗試不同的解決方案)之後調用特定的方法。[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(checkCursor)userInfo:nil repeatats:NO]; 該方法與此類似: - (void)checkCursor {/ *檢查遊標* /} – Sylter

+1

currentCursor指的是您應用程序的當前遊標,而不是當前活動應用程序中的遊標。 –