在某种程度上,您可以使用 Core Image 过滤器来做到这一点。但是,这是私有 API,因此您需要小心,因为这些东西可能会在未来的 OS X 版本中更改或消失,并且您显然无法将您的应用程序提交到 App Store。 我认为公共 API 不可能实现这样的事情。
编辑:请参阅 Nikolai Ruhe 的回答,了解使用公共 API 的更好方法。你可以用 Core Image 滤镜做一些你不能用伽玛表做的事情(例如应用模糊滤镜等),所以我会在这里留下我的答案。
这是一个如何反转窗口后面的示例:
//Declarations to avoid compiler warnings (because of private 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; // under the window
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
(改编自Steven Troughton Smith's article here)
效果并不完美,因为出于某种原因,窗口必须具有不完全透明的背景颜色,但它非常接近。
要影响整个屏幕,您可以创建一个无边框窗口,将ignoresMouseEvents 设置为YES(这样您就可以点击它)。
您可以尝试使用其他过滤器,但并非所有过滤器都适用于此。在这个逆向工程的标头中有一些关于 CGS... 函数的信息:http://code.google.com/p/undocumented-goodness/source/browse/trunk/CoreGraphics/CGSPrivate.h