4

私は私ができることを知っています

tell application "Safari" to id of window 1

SafariのウィンドウIDを取得します。ただし、これは Applescriptable アプリケーションに対してのみ機能します。PID を入力として取り、ウィンドウ ID を出力するプログラムを作成できるようにしたいと考えています。(興味がある場合は、これを使用して、文書化されていない「CGSMoveWorkspaceWindowList」にウィンドウ ID を提供し、10.6 のスペース間でアプリケーションを移動します。)

この質問によると、Objective-C を使用した OSX Accessibility API の文書化されていない API を介してそれを行うことができます。残念ながら、著者はそれに関する追加情報を指定していません。

もちろん、私は Objective-C と結婚しているわけではありません。可能な限り PID から WID を取得したいだけです。誰かが方法を知っている場合、もう1つの可能性は、現在アクティブ化されている/最前面のプロセスからWIDを取得することです(特定のPIDをアクティブ化するコマンドラインツールがあります)。

編集: weichsel が正しい道を教えてくれたおかげで、すべてのウィンドウ データを出力するプログラムを作成しました。

#include <Carbon/Carbon.h>

// compile as such:
//  gcc -framework carbon -framework foundation GetWindowList.c

int main(int argc, char **argv) {

    CFArrayRef windowList;

    if (argc != 1) {
        printf("usage: %s\n", argv[0]);
        exit(1);
    }

    windowList = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID);
    NSLog(CFSTR("Array: %@"), windowList);
    CFRelease(windowList);

}

次に、Python を使用してすべてのデータを解析しました。主な理由は、Objective-C でそれを行う方法について何も考えていなかったためです。いずれにせよ、Python はおそらくコード行数が少ないでしょう。=D

import os
import re

PID_WID_List = []
temp = os.popen('./GetWindowList 2>&1').read().strip().split('},')
for i in temp:
    match = re.search('kCGWindowOwnerPID = (\d+);', i)
    pid = match.group(1)
    match = re.search('kCGWindowNumber = (\d+);', i)
    wid = match.group(1)
    PID_WID_List.append((pid, wid))

NSLog はすべてを system.log に書き込むため、この方法は無限のチェック ループには適していないことに注意してください。

今後ともヴァイセルをよろしくお願いいたします。

4

1 に答える 1

3

リンク先の質問には、既に回答の一部が含まれています。
ウィンドウの順序付きリスト (ID とレベルを含む) を取得する Objective-C の方法は、Quartz ウィンドウ サービス API (CGWindowList...) です。

Apple は、「Son of Grab」サンプル コード プロジェクトを提供しています。これにより、httpsCGWindowListCopyWindowInfo : //developer.apple.com/library/mac/samplecode/SonOfGrab/ によって返されるすべての値を調べることができます。

ウィンドウ情報ディクショナリには「最前面」キーが明示的に含まれていませんが、要素のリストをフィルタリングして最初の要素を選択することで、正しいウィンドウを見つけることができるはずですkCGWindowLayer == 0(リストは前から後ろに並べられています)。
ディクショナリにはkCGWindowOwnerPIDキーも含まれています。

于 2013-06-06T07:05:45.960 に答える