Ich möchte wissen, ob es möglich ist, herauszufinden, welcher Prozess für das Erstellen/Verwalten eines Fensters in Mac OS X verantwortlich ist.
Wenn beispielsweise mehrere Instanzen einer Anwendung gestartet werden, wie kann ich die Prozess-ID (PID) ermitteln, die einem bestimmten Fenster entspricht? Oder wie kann ich die PID des Besitzers eines modalen Dialogfensters ohne Titel ermitteln?
Ich weiß, dass es in Windows möglich ist, mit demSysinternals-SuiteTool, das eine Möglichkeit bietet, nach einer Bibliothek zu suchen, die mit einigen Daten ausgeführt wird.
Ich suche nach einem Mechanismus ähnlich dem indieser Blogbeitrag.
In diesem Fall fanden sie mithilfe der Sysinternals Suite (und Process Explorer) heraus, welche DLL/welches Programm die Webcam verwendete, indem sie nach einer DLL oder einem Teilstring suchten (in diesem Fall anhand des physischen Namens des Geräts).
Gibt es also einen Mechanismus oder ein Programm, oder haben Sie eine Idee, wie man für Mac OS X nach etwas Ähnlichem sucht? Wie kann ich feststellen, welcher Prozess ein Fenster gestartet hat?
Antwort1
Ich habe verwendetdieses Python 2-Skript. Es ist nicht narrensicher, aber bei mir funktioniert es ziemlich gut.
Hier ist eine Zusammenfassung seiner Funktionsweise: Es verwendet CGWindowListCopyWindowInfo
, das aus importiert wird Quartz
, um Fensterinformationen vom System zu sammeln, fordert den Benutzer dann auf, das gewünschte Fenster zu verschieben, sammelt dann erneut Fensterinformationen und zeigt Informationen für die geänderten Fenster an. Die ausgegebenen Informationen enthalten die Prozess-ID als kCGWindowOwnerPID
.
Hier ist der Code:
#!/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'
Das Skript druckt Informationen für das Fenster aus, das innerhalb eines 5-Sekunden-Intervalls seine Position geändert hat. Die Ausgabe sieht also folgendermaßen aus:
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;
}
)}
Antwort2
Ich habe ein Werkzeug namenslswin
#!/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)
Antwort3
Es gibt ein direktes, benutzerfreundliches, betriebssystemeigenes Tool zur Überprüfung jedes Fensters, das neben den zugehörigen Prozessen auch umfassende Informationen liefert, wie z. B. die ursprüngliche Codehierarchie: Es befindet sich unter Xcode Developer Tools und heißtAccessibility Inspector
Antwort4
Du kannst den ... benutzenAutomator.appdafür:
- Starten Sie Automator (geben Sie im Spotlight
Automator.app
+ ein Enter) - Erstellen Sie einen neuen Workflow.
- Wählen Sie im MenüArbeitsablauf>Aufzeichnen(oder klicken Sie auf das