Chciałbym wiedzieć, czy można określić, który proces jest odpowiedzialny za utworzenie / zarządzanie oknem w Mac OS X.
Na przykład, gdy uruchomionych jest wiele instancji aplikacji, jak mogę uzyskać identyfikator procesu (PID) odpowiadający jednemu konkretnemu oknu? Lub jeśli istnieje modalne okno dialogowe bez tytułu, jak mogę uzyskać PID jego właściciela?
Wiem, że w systemie Windows możliwe jest użycie narzędzia Sysinternals Suite , które umożliwia wyszukiwanie biblioteki działającej z niektórymi danymi.
Szukam mechanizmu podobnego do tego, który pojawia się na tym blogu .
W tym przypadku, korzystając z Sysinternals Suite (i Process Explorer), znaleźli bibliotekę DLL / program korzystający z kamery internetowej, szukając biblioteki DLL lub podłańcucha (w tym przypadku przy użyciu fizycznej nazwy urządzenia).
Czy istnieje jakiś mechanizm lub program, czy masz pojęcie o tym, jak wyszukać coś podobnego dla Mac OS X? Jak rozpoznać, który proces uruchomił okno?
Odpowiedzi:
Użyłem skryptu Python . Nie jest niezawodny, ale działa całkiem dobrze dla mnie.
Nie będę ponownie publikować pełnego skryptu bez pozwolenia, ale oto podsumowanie: Używa
CGWindowListCopyWindowInfo
, które jest importowaneQuartz
, aby zebrać informacje o oknie z systemu, następnie prosi użytkownika o przeniesienie żądanego okna, a następnie ponownie zbiera informacje o oknie i pokazuje informacje dla tych, którzy się zmienili. Zrzucone informacje obejmują identyfikator procesu, askCGWindowOwnerPID
.Oto kod:
Skrypt drukuje informacje dla okna, które zmieniło pozycję w odstępie 5 sekund. Wynik wygląda następująco:
źródło
Zrobiłem narzędzie o nazwie
lswin
Następnie możesz użyć grep, aby znaleźć pid swojego okna.
Oto kod źródłowy skryptu:
źródło
@kenorb Połączyłem twoje 2 wersje skryptu, w zasadzie działa jak pierwsza, pokazuje różnicę, ale formatowanie jest z drugiej. Również jeśli okno nie jest wyświetlane na ekranie - nie jest drukowane, w przeciwnym razie powoduje zbyt wiele śmieci
źródło
pip install pyobjc-framework-Quartz