2013-10-24 9 views
11

プライベートAPI CGSAddWindowFilter()の使用に関連する古いトリックは、何らかの理由でマーベリックスでもう機能していないようです。私はHow does on-screen color inversion work in OS X?に記載されているいくつかのコードを試したところ、次のコードは次のようになりますwindowNSWindowでOSX 10.9(Mavericks)でCIFilterを使用するには?

#import "AppDelegate.h" 

//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 

    /* Make a new connection to CoreGraphics */ 
    CGSNewConnection(NULL, &thisConnection); 

    /* Create a CoreImage filter and set it up */ 
    CGSNewCIFilterByName(thisConnection, CFSTR("CIColorInvert"), &compositingFilter); 
    NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:3.0] forKey:@"inputRadius"]; 
    CGSSetCIFilterValuesFromDictionary(thisConnection, compositingFilter, (__bridge CFDictionaryRef)options); 

    /* Now apply the filter to the window */ 
    CGSAddWindowFilter(thisConnection, (CGSWindowID)[self.window windowNumber], compositingFilter, compositingType); 
} 

@end 

誰でも、OSX 10.8と同じようにフィルタをバックグラウンドに適用する方法を知っていますか?

マーベリックスでMenuBarFilterをもう一度動作させるには、これが必要です。

答えて

-4

CIFilter * filter = [CIFilter filterWithName:@ ""];

これは、フィルタを作成する方法であり、「」

7

間の任意のフィルタタイプを書くあなたが行く:

typedef void * CGSConnection; 
extern OSStatus CGSSetWindowBackgroundBlurRadius(CGSConnection connection, NSInteger windowNumber, int radius); 
extern CGSConnection CGSDefaultConnectionForThread(); 

- (void)enableBlurForWindow:(NSWindow *)window 
{ 
    [window setOpaque:NO]; 
    window.backgroundColor = [NSColor colorWithCalibratedWhite:1.0 alpha:0.5]; 

    CGSConnection connection = CGSDefaultConnectionForThread(); 
    CGSSetWindowBackgroundBlurRadius(connection, [window windowNumber], 20); 
} 
+1

2ヶ月前は何もしていません。しかし、今回はありません!ちょうど知るために、これは10.8以下でどのように動作しますか? –

+1

私は昨日何も来なかったので、Terminal.appをリバースエンジニアリングすることにしました。これを発見しました。これは古いOSXバージョンと互換性があるかどうかわかりませんが、テストしてお知らせします。 –

+0

Parallelsでは10.8をテストすることができません。これらのエフェクトは機能しませんが、10.8のTerminal.appはこの関数を使用しているため、動作しています。 –

0

は、このソリューションを使用しないでください。このAPIの使用により私のアプリケーションは拒否されました(プライベートApi)

Appleがrespose以下に私のアプリを拒否:

を「非パブリックAPIの使用は、ユーザーエクスペリエンスの低下につながることができ これらのAPIは、将来的に変更する必要がありますので、許可されていません。 アプリには、フレームワーク '/System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics'のCGSSetWindowBackgroundBlurRadiusが含まれています。

関連する問題