我正在研究一個應用程序,它使用Carbon和Cocoa位來處理一些爲Windows編寫的C++代碼。我目前遇到了一個問題,當用戶將cmd +標籤頁移出窗口,或者只是將鼠標懸停在碼頭上(而不僅僅是應用程序的圖標 - 碼頭上的任何位置)時,遊標(使用Cocoa NSCursor類)從自定義光標更改爲正常OS X光標。Carbon/Cocoa懸停在Dock事件
基本上,有沒有人知道當用戶懸停在碼頭上時會發送到應用程序(由Carbon和Cocoa發送)的內容?
我正在研究一個應用程序,它使用Carbon和Cocoa位來處理一些爲Windows編寫的C++代碼。我目前遇到了一個問題,當用戶將cmd +標籤頁移出窗口,或者只是將鼠標懸停在碼頭上(而不僅僅是應用程序的圖標 - 碼頭上的任何位置)時,遊標(使用Cocoa NSCursor類)從自定義光標更改爲正常OS X光標。Carbon/Cocoa懸停在Dock事件
基本上,有沒有人知道當用戶懸停在碼頭上時會發送到應用程序(由Carbon和Cocoa發送)的內容?
這是因爲Dock覆蓋了任何光標更改。你需要做的是設置一個定時器,重複觸發來改變光標。
首先創建一個可以讓你改變你的光標,然後設置的CustomCursor
func changeCursor() {
/* Code here to create custom cursor */
customCursor.set()
}
然後,當你準備好改變光標,你需要明星計時器,讓它一再火
的方法//cursorTimer is an NSTimer object that you need to keep track of
self.cursorTimer = NSTimer.scheduledTimerWithTimeInterval(0.001, target:self, selector: "changeCursor", userInfo: nil, repeats: true)
當你做,你可以無效定時器
self.cursorTimer.invalidate()
此外,只有當你的應用程序是最前面的時候纔會有效。如果有人按下command + tab,你的應用將不能再設置光標。爲了讓您的應用在後臺控制光標,您必須使用私有API,因此不需要Mac App Store。
在你的橋接報頭,你可以添加以下代碼
typedef int CGSConnectionID;
CGError CGSSetConnectionProperty(CGSConnectionID cid, CGSConnectionID targetCID, CFStringRef key, CFTypeRef value);
int _CGSDefaultConnection();
然後在AppDelegate中,您可以添加該代碼applicationDidFinishLaunching
let propertyString = CFStringCreateWithCString(kCFAllocatorDefault, "SetsCursorInBackground", 0)
CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, kCFBooleanTrue)
你找到了一種方法來做到這一點? – 2012-11-03 14:04:35
目前,你的代碼中光標的確切變化是什麼?在我的情況下,在'NSView'子類中實現'resetCursorRects'方法(在視圖的'bounds'上調用'addCursorRect:cursor:')就足夠了;光標形狀恢復自身。 – 2013-05-15 05:14:37