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).
"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. –
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
Okay, das ist einfach bizarr. Vielleicht wird dieses Flag * auch * anderswo gesetzt, wenn Sie die NSWindow-Methoden verwenden. –