2016-11-23 4 views
0

私は、フォーカスを維持せずに実行中のアプリケーションの上に外部アプリケーション(つまり、テキストエディット)を浮かせるOS Xアプリケーションを作成しようとしていますが、決して消えません。基本的に私がしようとしているのは、ForceQuitアプリケーション(Press option-command-escを見てください)を模倣しています。外部アプリをOS Xアプリケーションの上にフロートする

私は限られた成功を収めて、今やっていることはこれです:

が上にそれを置く保つためにNSTimerの作成:

_timer = [NSTimer scheduleTimerWithTimeInterval:0.1 target:self selector:@selector(keepTextEditOnTop) userInfo:nil repeats:YES]; 

...

前にテキストエディットを持参:

- (void)keepTextEditOnTop { 
    AXUIElementRef appRef = AXUIElementCreateApplication(_textEditProcessID); 
    AXUIElementSetAttributeValue(appRef, kAXFrontmostAttribute, kCFBooleanTrue); 
} 

テキストエディットウィンドウは、クリックすると上にとどまります。フォーカス)。しかし、2つの問題があります。 1.)それは上に戻って短く点滅します2.)基本的に常にフォーカスを維持して、基礎をなすアプリと対話できないようにします。

appRefから、あなたは窓を得ることができます:

CFArrayRef windowList; 
AXUIElementCopyAttributeValue(appRef, kAXWindowsAttribute, (CFTypeRef *)&windowList); 

AXUIElementRef windowRef = (AXUIElementRef) CFArrayGetValueAtIndex(windowList, 0); 

をしかし、私はNSWindowのに変換することが可能になるとは思いません。私がそれをすることができれば、私はそれをメインウインドウの子ウインドウ、または単なるフローティングウインドウにすることができると思います。

どのようにこれを行うことができますか?

- (void)testing{ 

    CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); 
    for (NSMutableDictionary* entry in (__bridge NSArray*)windowList) 
    { 
     NSString* ownerName = [entry objectForKey:(__bridge id)kCGWindowOwnerName]; 
     NSString *windowNum = [entry objectForKey:(__bridge id)kCGWindowNumber]; 
    if([ownerName isEqualToString:@"Sublime Text"]){ 
     [self holdToTheFront:[windowNum integerValue]]; 
    } 
} 
CFRelease(windowList); 

}

以下のコメントで述べたようにEXC_BAD_ACCESSエラーを取得:

- (void)holdToTheFront:(NSInteger)winNum { 
    objc_object* nsviewObject = reinterpret_cast<objc_object *>(winNum); 

    //Getting a "Thread 1:EXC_BAD_ACCESS (code=1, address=0x18)" at the line below: 
    NSWindow* nsWindowObject = ((id (*)(id, SEL))objc_msgSend)((__bridge NSView *)nsviewObject, sel_registerName("window")); 

    int NSWindowCollectionBehaviorCanJoinAllSpaces = 1 << 0; 
    ((id (*)(id, SEL, NSUInteger))objc_msgSend)(nsWindowObject, sel_registerName("setCollectionBehavior:"), NSWindowCollectionBehaviorCanJoinAllSpaces); 
} 
私はこれをしようとしている@TheDarkKnight

からの提案を追加

編集 -

答えて

0

アプリケーションのためにすべてのスペースに表示されるようにndow、あなたはこのような何かを行うことができます: -

windowObjectはあなたが上に残るしたいアプリケーションウィンドウの windowNumberある
objc_object* nsviewObject = reinterpret_cast<objc_object *>(windowObject); 
objc_object* nsWindowObject = objc_msgSend(nsviewObject, sel_registerName("window")); 
int NSWindowCollectionBehaviorCanJoinAllSpaces = 1 << 0; 
objc_msgSend(nsWindowObject, sel_registerName("setCollectionBehavior:"), NSWindowCollectionBehaviorCanJoinAllSpaces); 

+0

ありがとうございます!私は朝にそれを撃つだろう。 – user3564870

+0

私はそれがアプリケーションが所有していないウィンドウのウィンドウ番号を取得することは可能だとは思わない。次に、外部アプリがCocoaであるという前提があります。 – user3564870

+0

[this](http://stackoverflow.com/questions/2107657/mac-cocoa-getting-a-list-of-windows-using-accessibility-api)は役に立ちますか? – TheDarkKnight

関連する問題