私は私ができることを知っています
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 に書き込むため、この方法は無限のチェック ループには適していないことに注意してください。
今後ともヴァイセルをよろしくお願いいたします。