Углерод / Какао парят над доком

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

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

1 ответ

Это потому, что 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()

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