我想知道是否可以確定哪個進程負責在 Mac OS X 中建立/管理視窗。
例如,當啟動一個應用程式的多個實例時,如何取得某個特定視窗對應的進程ID(PID)?或者如果有一個沒有標題的模態對話框窗口,我如何取得其所有者的PID?
我知道在 Windows 中可以使用系統內部套件工具提供了一種搜尋正在運行某些資料的庫的方法。
我正在尋找一種類似於中出現的機制這篇博文。
在本例中,他們使用 Sysinternals Suite(和 Process Explorer)透過搜尋 DLL 或子字串(在本例中使用裝置的實體名稱)來找到哪個 DLL/程式正在使用網路攝影機。
那麼有沒有什麼機製或程序,或者你知道如何為 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
有一個直接用戶友好的作業系統本機工具用於檢查每個窗口,除了相關過程之外,它還提供全面的信息,例如原始代碼層次結構:它可以在 Xcode 開發人員工具下找到,並稱為Accessibility Inspector
答案4
您可以使用Automator.app為了這:
- 啟動 Automator(聚光燈類型
Automator.app
+ Enter) - 建立新的工作流程。
- 在選單上選擇工作流程>記錄(或單擊