2012-08-02 17 views
1

Я работаю над приложением, которое использует биты Carbon и Cocoa для обработки кода C++, написанного для Windows. В настоящее время у меня проблема, когда пользователь либо cmd + tabs выходит из окна, либо просто наводит указатель мыши на док-станцию ​​(а не только значок приложения - в любом месте док-станции), курсор (используя класс Cocoa NSCursor) изменяется с пользовательского курсора на обычный курсор OS X.Carbon/Cocoa hover over dock event

В принципе, кто-нибудь знает, что будет отправлено в приложение (как Carbon, так и Cocoa), когда пользователь навешивается над док-станцией?

+0

вы нашли способ сделать это? –

+0

Как именно курсор изменился в вашем коде, в настоящее время? В моем случае реализация метода 'resetCursorRects' в подклассе' NSView' (для вызова 'addCursorRect: cursor:' на 'ограничениях ') была достаточной; форма курсора восстанавливается. –

ответ

0

Это связано с тем, что 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() 

Кроме того, это будет работать, только если ваше приложение больше всего. Если кто-то нажмет команду + вкладку, ваше приложение больше не сможет установить курсор. Чтобы ваше приложение могло управлять курсором, в то время как в фоновом режиме вы должны использовать частные 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)