Nicht-besessenes Fenster immer im Vordergrund setzen - Wie die App "Afloat"

Ich habe einen globalen Hotkey mit @ eingerichtRegisterEventHotkey. Wenn der Benutzer darauf drückt, wird das aktuell fokussierte Fenster mit @ angezeigCGWindowListCopyWindowInfo, und dann muss ich es immer oben einstellen.

Wenn sich das aktuelle Fenster in meinem Prozess befindet (von dem aus ich den Code ausführe), kann ich einfach das @ konvertierewindowNumber vonCGWindowListCopyWindowInfo zu einerNSWindow und TUsetLevel:

nswin = [NSApp windowWithWindowNumber:windowNumber]
[nswin setLevel: Int(CGWindowLevelForKey(kCGFloatingWindowLevelKey))]

Mein Proble Ich kann dies nicht tun, wenn sich das aktuell fokussierte Fenster nicht in meinem Prozess befindet. Können Sie mir bitte zeigen, wie?

Bestellung, die ich versucht habe:

Diese App hier mit dem Namen "Afloat" verwendete "SIMBL", um dies zu erreichen. Von jedem Fenster aus können Sie Cmd + A drücken und es wird immer oben gesetzt. Ich versuche jedoch, C / ObjC von meiner normalen Desktop-App aus zu nutzen, ohne auf Helfer wie SIMBL zu verzichten.Quelle:Force behält das App-Fenster im Vordergrund - Mac OS XSIMBL:http: //www.culater.net/software/SIMBL/SIMBL.phAfloat:https: //www.macupdate.com/app/mac/22237/afloa

Ich komme überCGSSetWindowLevel imCGPrivate.h - undokumentiertes Zeug -https: //gist.github.com/Noitidart/3664c5c2059c9aa6779f#file-cgsprivate-h-L6 - Ich erinnere mich jedoch, dass ich in der Vergangenheit so etwas versucht habe, aber beim Versuch, eine Verbindung zu einem Fenster herzustellen, das sich nicht im aufrufenden Prozess befindet, eine Fehlermeldung angezeigt wurde.

Es sagt hier -https: //github.com/lipidity/CLIMac/blob/114dfee39d24809f62ccb000ea22dfda15c11ce8/src/CGS/CGSInternal/.svn/text-base/CGSConnection.h.svn-base#L8

Nur der Eigentümer eines Fensters kann es manipulieren. Apple hat also das Konzept eines universellen Eigentümers, der alle Fenster besitzt und sie alle manipulieren kann. Es kann immer nur einen universellen Eigentümer geben (das Dock).

Maybe, gibt es überhaupt etwas, das vorgibt, dass mein Anrufvorgang vorübergehend das Dock ist? Könnte seinCGSGetConnectionIDForPSN für das Dock dann diese Verbindung verwenden?

Meine Verwendung: Ich versuche, die Funktionalität meines kostenlosen Open Source-Browser-Addons zu replizieren -https: //addons.mozilla.org/en-US/firefox/addon/topick - also mein Aufrufvorgang bei Firefox. Es funktioniert momentan unter Windows und Linux und muss nur herausfinden, wie es unter Mac für Nicht-Firefox-Fenster funktioniert.

Antworten auf die Frage(0)

Ihre Antwort auf die Frage