Pracuję nad aplikacją, która używa bitówCarbon i Cocoa do obsługi kodu C ++ napisanego dla systemu Windows. Obecnie mam problem polegający na tym, że gdy użytkownik albo cmd + tabuluje poza oknem, albo po prostu najeżdża kursorem myszy na stację dokującą (nie tylko ikonę aplikacji - gdziekolwiek w stacji dokującej), kursor (używając Cocoa Klasa NSCursor) zmienia się z niestandardowego kursora na normalny kursor OS X.
Zasadniczo, czy ktoś wie, co jest wysyłane do aplikacji (zarówno przez Carbon, jak i Cocoa), gdy użytkownik unosi się nad dokiem?
Odpowiedzi:
0 dla odpowiedzi № 1Wynika to z faktu, że dok zastępuje wszelkie zmiany kursora. To, co musisz zrobić, to ustawić zegar, który wielokrotnie uruchamia się, aby zmienić kursor.
Najpierw utwórz metodę, która pozwoli Ci zmienić kursor, a następnie ustaw customCursor
func changeCursor() {
/* Code here to create custom cursor */
customCursor.set()
}
Następnie, gdy jesteś gotowy, aby zmienić kursor, musisz oznaczyć stoper gwiazdką i pozwolić mu wielokrotnie odpalać
//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)
A kiedy skończysz, możesz unieważnić timer
self.cursorTimer.invalidate()
Działa to również tylko wtedy, gdy aplikacja jest z przoduwiększość. Jeśli ktoś naciśnie klawisze Command + Tab, aplikacja nie będzie mogła ustawić kursora. Aby umożliwić aplikacji sterowanie kursorem w tle, musisz używać prywatnych interfejsów API, więc nie ma Mac App Store.
W nagłówku pomostowym możesz dodać następujący kod
typedef int CGSConnectionID;
CGError CGSSetConnectionProperty(CGSConnectionID cid, CGSConnectionID targetCID, CFStringRef key, CFTypeRef value);
int _CGSDefaultConnection();
A następnie w AppDelegate możesz dodać ten kod do applicationDidFinishLaunching
let propertyString = CFStringCreateWithCString(kCFAllocatorDefault, "SetsCursorInBackground", 0)
CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, kCFBooleanTrue)