Mac OS X でどのプロセスがどのウィンドウを実行しているかを識別するにはどうすればよいでしょうか?

Mac OS X でどのプロセスがどのウィンドウを実行しているかを識別するにはどうすればよいでしょうか?

Mac OS X でウィンドウの作成/管理を担当するプロセスを特定できるかどうかを知りたいです。

たとえば、アプリケーションの複数のインスタンスが起動されている場合、特定のウィンドウに対応するプロセス ID (PID) を取得するにはどうすればよいでしょうか。または、タイトルのないモーダル ダイアログ ウィンドウがある場合、その所有者の PID を取得するにはどうすればよいでしょうか。

Windowsでは、Sysinternals スイートあるデータで実行されているライブラリを検索する方法を提供するツール。

私は、このブログ投稿

この場合、Sysinternals Suite (および Process Explorer) を使用して、DLL またはサブ文字列 (この場合はデバイスの物理名を使用) を検索することで、どの DLL/プログラムが Web カメラを使用しているかがわかりました。

それで、Mac OS X で同様のものを検索するメカニズムやプログラムはありますか、または方法について何かアイデアはありますか? どのプロセスがウィンドウを起動したかを識別するにはどうすればよいでしょうか?

答え1

私は使ったことがあるこのPython 2スクリプト完璧ではありませんが、私にとってはかなりうまく機能します。

機能の概要は次のとおりです。CGWindowListCopyWindowInfoからインポートされたを使用してQuartzシステムからウィンドウ情報を収集し、ユーザーに目的のウィンドウを移動するように要求し、ウィンドウ情報を再度収集して、変更されたウィンドウの情報を表示します。ダンプされる情報には、 としてプロセス ID が含まれますkCGWindowOwnerPID

コードは次のとおりです:

#!/usr/bin/env python

import time
from Quartz import CGWindowListCopyWindowInfo, kCGWindowListExcludeDesktopElements, kCGNullWindowID
from Foundation import NSSet, NSMutableSet

wl1 = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID)
print 'Move target window'
time.sleep(5)
wl2 = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID)

w = NSMutableSet.setWithArray_(wl1)
w.minusSet_(NSSet.setWithArray_(wl2))
print '\nList of windows that moved:'
print w
print '\n'

このスクリプトは、5 秒間隔で位置が変更されたウィンドウの情報を出力します。出力は次のようになります。

List of windows that moved:
{(
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 217;
            Width = 420;
            X = 828;
            Y = 213;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 8;
        kCGWindowMemoryUsage = 406420;
        kCGWindowName = "";
        kCGWindowNumber = 77;
        kCGWindowOwnerName = UserNotificationCenter;
        kCGWindowOwnerPID = 481;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
    }
)}

答え2

私は、lswin

#!/usr/bin/env python

# Install Quartz with 'pip install -U pyobjc-framework-Quartz'
import Quartz

#wl = Quartz.CGWindowListCopyWindowInfo( Quartz.kCGWindowListOptionOnScreenOnly | Quartz.kCGWindowListExcludeDesktopElements, Quartz.kCGNullWindowID)
wl = Quartz.CGWindowListCopyWindowInfo( Quartz.kCGWindowListOptionAll, Quartz.kCGNullWindowID)

wl = sorted(wl, key=lambda k: k.valueForKey_('kCGWindowOwnerPID'))

#print wl

print('PID'.rjust(7) + ' ' + 'WinID'.rjust(5) + '  ' + 'x,y,w,h'.ljust(21) + ' ' + '\t[Title] SubTitle')
print('-'.rjust(7,'-') + ' ' + '-'.rjust(5,'-') + '  ' + '-'.ljust(21,'-') + ' ' + '\t-------------------------------------------')

for v in wl:
    raw_chars = ( \
        str(v.valueForKey_('kCGWindowOwnerPID') or '?').rjust(7) + \
        ' ' + str(v.valueForKey_('kCGWindowNumber') or '?').rjust(5) + \
        ' {' + ('' if v.valueForKey_('kCGWindowBounds') is None else \
            ( \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('X')))     + ',' + \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Y')))     + ',' + \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Width'))) + ',' + \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Height'))) \
            ) \
            ).ljust(21) + \
        '}' + \
        '\t[' + ((v.valueForKey_('kCGWindowOwnerName') or '') + ']') + \
        ('' if v.valueForKey_('kCGWindowName') is None else (' ' + v.valueForKey_('kCGWindowName') or '')) \
    )
    print(raw_chars)

答え3

各ウィンドウを検査するための、直接ユーザーフレンドリーなOSネイティブツールがあり、関連するプロセスに加えて、元のコード階層などの包括的な情報を提供します。これはXcode開発者ツールの下にあり、Accessibility Inspector

答え4

あなたはAutomator アプリこのために:

  1. Automatorを起動します(スポットライトでAutomator.app+と入力Enter
  2. 新しいワークフローを作成します。
  3. メニューで選択ワークフロー>記録(または

関連情報