Zu einem gewissen Grad können Sie dies mit Core Image-Filtern tun. Dies ist jedoch eine private API, daher müssen Sie vorsichtig sein, da sich diese Dinge in zukünftigen OS X-Versionen ändern oder verschwinden könnten und Sie offensichtlich Ihre App nicht im App Store einreichen können. Ich denke nicht, dass so etwas mit öffentlichen APIs möglich ist.
Bearbeiten: Sehen Sie die Antwort von Nikolai Ruhe für eine bessere Methode, die öffentliche APIs verwendet. Mit Core Image-Filtern können Sie einige Dinge tun, die Sie mit einer Gamma-Tabelle nicht tun könnten (z.B. die Anwendung von Unschärfe-Filtern und ähnliches), daher lasse ich meine Antwort hier stehen.
Hier ist ein Beispiel, wie Sie das, was hinter einem Fenster liegt, invertieren können:
//Deklarationen, um Compilerwarnungen zu vermeiden (aufgrund privater APIs):
typedef void * CGSConnection;
typedef void * CGSWindowID;
extern OSStatus CGSNewConnection(const void **attributes, CGSConnection * id);
typedef void *CGSWindowFilterRef;
extern CGError CGSNewCIFilterByName(CGSConnection cid, CFStringRef filterName, CGSWindowFilterRef *outFilter);
extern CGError CGSAddWindowFilter(CGSConnection cid, CGSWindowID wid, CGSWindowFilterRef filter, int flags);
extern CGError CGSSetCIFilterValuesFromDictionary(CGSConnection cid, CGSWindowFilterRef filter, CFDictionaryRef filterValues);
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[self.window setOpaque:NO];
[self.window setAlphaValue:1.0];
[self.window setBackgroundColor:[NSColor colorWithCalibratedWhite:0.0 alpha:0.1]];
self.window.level = NSDockWindowLevel;
CGSConnection thisConnection;
CGSWindowFilterRef compositingFilter;
int compositingType = 1; // unter dem Fenster
CGSNewConnection(NULL, &thisConnection);
CGSNewCIFilterByName(thisConnection, CFSTR("CIColorInvert"), &compositingFilter);
NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:3.0] forKey:@"inputRadius"];
CGSSetCIFilterValuesFromDictionary(thisConnection, compositingFilter, (CFDictionaryRef)options);
CGSAddWindowFilter(thisConnection, (CGSWindowID)[self.window windowNumber], compositingFilter, compositingType);
}
@end
(adaptiert von Steven Troughton Smiths Artikel hier)
Der Effekt ist nicht perfekt, da aus irgendeinem Grund erforderlich ist, dass das Fenster eine Hintergrundfarbe hat, die nicht vollständig transparent ist, aber er ist ziemlich nah dran.
Um den gesamten Bildschirm zu beeinflussen, könnten Sie ein randloses Fenster erstellen, bei dem ignoresMouseEvents
auf YES
gesetzt ist (damit Sie hindurchklicken können).
Sie können mit anderen Filtern experimentieren, aber nicht alle funktionieren möglicherweise dafür. Es gibt einige Informationen zu den CGS...
-Funktionen in diesem reverse-engineered Header: http://code.google.com/p/undocumented-goodness/source/browse/trunk/CoreGraphics/CGSPrivate.h