2017-11-02 9 views
2

CGWindowListCopyWindowInfoから返される値に基づいてウィンドウをactivate (bring to the fore)にすることは可能ですか? (すなわちwindow ID (kCGWindowNumber) or something elseを使用する。)MacOS - ウィンドウIDを指定してウィンドウをアクティブにする

編集:

私は(アクセシビリティ権限で実行します)私のアプリは他のアプリのウィンドウのためにこれを行うことができる必要があることを指定する必要があります。

質問を投稿して以来、私はAXUIElementPerformActionを発見しました。私はこれで正しい方向に進んでいますか?

または、AppleScript Bridgeを自分のコード内で実行している最善の方法ですか?

+0

自分のアプリやアプリが実行されていますか? –

+0

他のアプリの場合編集を参照してください。 –

答えて

0

プロセスにpidで接続し、そのウィンドウを取得できます。次に、このように、フロントに持参するkAXRaiseActionを使用します。

AXUIElementRef element = AXUIElementCreateApplication(pid); 
if (element) { 
    CFArrayRef array; 
    AXUIElementCopyAttributeValues(element, kAXWindowsAttribute, 0, 99999, &array); 

    if (array == nullptr) 
    return; 

    NSArray *windows = (NSArray *)CFBridgingRelease(array); 
    for (NSUInteger i = 0; i < windows.count; ++i) { 
    AXUIElementRef ref = (__bridge AXUIElementRef)(windows[i]); 
    AXError error = AXUIElementPerformAction(element, kAXRaiseAction); 
    // handle error 
    } 
} 

CFRelease(element); 

不要の​​配列や窓を解放します。配列内の子は自動的に処理され、配列はARCによって解放されたNSArrayにブリッジされます。

+0

私は特にウィンドウIDを使ってウィンドウを識別したかったのです。私が見つけた質問を投稿してから、これを行う直接的な方法はありません。ただし、実行できるのは、タイトル、位置、およびサイズに基づいて、ウィンドウ(CGWindowListCopyWindowInfo()によって返されたものとAXUIElementCopyAttributeValues()によって返されたもの)が一致することです。ユニークなマッチを見つけることができない(まれなケース)ので、AXI APIを使用してウィンドウサイズを1ピクセル程度変更することで、対象のCGWindowに一致する正確なものを見つけることができます。 –

+0

しかし、はい、AXRaiseは後で行うことです。続いてNSRunningApplication.activate() –

関連する問題