2014-12-29 17 views
7

Wenn Sie CGWindowListCopyWindowInfo() aufrufen, enthält die CFDictionaryRef, die Sie zurück erhalten, eine Anzahl von keys and values. Eines davon ist kCGWindowSharingState, die drei mögliche Werte hat:Was macht eigentlich kCGWindowSharingState * *?

Window Sharing Constants 
Specifies whether and how windows are shared between applications. 

enum { 
    kCGWindowSharingNone  = 0, 
    kCGWindowSharingReadOnly = 1, 
    kCGWindowSharingReadWrite = 2 
}; 

Fast alle Fenster auf meinem System sind kCGWindowSharingReadOnly und das SonOfGrab screen-shot Beispielprogramm vermeidet versucht kCGWindowSharingNone Fenster zu erfassen , aber ich konnte keine gute Beschreibung finden, wofür diese Staaten verwendet werden sollen.

Ein einfacher Test scheint zu zeigen, dass einige der mit OS X gelieferten Apps Fenster haben, die auf kCGWindowSharingNone, insbesondere Notes und iBooks, eingestellt sind. Soweit ich durch einen Schnelltest feststellen konnte, verhindert das Fenster kCGWindowSharingNone nicht, dass CGWindowListCreateImage() ein Bild dieses Fensters erfasst. Es gibt keine Fenster, die ich finden konnte, die kCGWindowSharingReadWrite als ihren Freigabe-Modus festgelegt haben.

Wird all dies irgendwo in der Dokumentation erklärt, und ich habe es einfach verpasst, oder ist es nur noch wenig dokumentierte Core Graphics Funktionalität? Gibt es einen guten Grund, nicht zu versuchen, kCGWindowSharingNone Windows zu erfassen, und werde ich mich für Probleme in der Zukunft einrichten, wenn ich versuche, dies zu tun?


Weitere Untersuchungen haben gezeigt, dass, wenn eine Cocoa app

[NSWindow setSharingType:] 

Anrufe, die kCGWindowSharingStateNone auf dem Fenster setzt, und verhindert, dass er durch CGWindowListCreateImage eingefangen zu werden(). Es gibt auch einige andere Fenster, die kCGWindowSharingStateNone gesetzt haben, aber die können erfolgreich erfasst werden - insbesondere erstellt iBooks ein Fenster wie folgt.

Dies ist vermutlich ein Fehler in iBooks, oder in welcher API es ruft (da es die NSWindow API nicht aufruft).

Antwort

5

Wenn Sie den Freigabestatus eines Fensters ignorieren, sollten Sie darauf vorbereitet sein, dass sich einige Fenster genau so verhalten, wie es die API angibt, und anscheinend nach Ihren eigenen Recherchen nicht.

Höher in den Cocoa APIs, NSWindow hat eine sharingType Eigenschaft. Wenn Sie diesen Wert auf NSWindowSharingTypeNone setzen, hat der entsprechende CGWindow einen Freigabetyp von kCGWindowSharingNone.

Wenn ich diese Eigenschaft in einem Fenster in meiner eigenen Anwendung ändere, verhindert dies, dass andere Anwendungen die CGWindow-API zum Erfassen des Fensterinhalts verwenden. Die Dokumentation für CGWindowListCreateImage scheint auch korrekt zu sein.

Alle Fenster, die auf dem Bildschirm angezeigt werden, deren Freigabeeinstellung jedoch auf kCGWindowSharingNone festgelegt ist, werden übersprungen und nicht im Ergebnisbild enthalten.

Wenn ich einen Multi-Fenster-Screenshot nehme, der das private Fenster enthalten sollte, fehlt dieses Fenster im Screenshot.


Ein Grund, warum man dies in Ihrer eigenen Anwendung tun könnte, ist von grafischen Inhalte zu verhindern, dass kopiert werden.

Ich weiß nicht, warum iBooks und Notes das von Ihnen beschriebene Verhalten aufweisen. Ich könnte mir vorstellen, dass Apple nicht möchte, dass ein Benutzer Inhalte von einem iBook kopieren kann, aber das ist eindeutig nicht der Fall und macht für Notes keinen Sinn (übrigens scheint das Fenster von Notes in 10.10.2 normal zu sein).

Mir ist keine Möglichkeit bekannt, den Lese-/Schreib-Typ für den Inhalt eines Fensters zu nutzen.

+0

"Notes" scheint am 10.9.5 zwischen NSWindowSharingTypeNone und NSWindowSharingTypeReadOnly hin und her zu wechseln, aber was das auslöst, ist unklar. Außerdem habe ich gerade mit SonOfGrab versucht, und es erfasst das iBooks-Fenster ganz gut als Teil des Bildes, wenn es einen Screenshot (mit CGWindowListCreateImage) erfasst, obwohl iBooks sein Fenster als kCGWindowSharingNone festgelegt hat. Ich werde das am 10.10 überprüfen müssen - vielleicht ist da etwas anderes. –

+0

Rechts. Apple Apps mit scheinbar privaten Fenstern verhalten sich nicht wie solche. Aber wenn ich 'NSWindowSharingTypeNone' auf meinen eigenen Fenstern verwende, respektieren Grab, SonOfGrab und mein eigener Fenstererfassungscode die Privatsphäre des Fensters vollständig. – Fabian

+0

Okay, das ist einfach bizarr. Vielleicht wird dieses Flag * auch * anderswo gesetzt, wenn Sie die NSWindow-Methoden verwenden. –