Crédit à réponse du superutilisateur pour ça.
Il existe certainement d'autres moyens d'y parvenir, mais si vous êtes habile avec Python, voici un script bien pratique qui vous montrera des détails pertinents pour les fenêtres actuellement affichées. Après l'exécution, déplacez la fenêtre en question, et le script vous donnera les spécificités (par exemple le PID) de cette fenêtre. A partir de là, vous pouvez fouiller et voir qui vous embête pour su.
#!/usr/bin/env python
import Quartz
import time
from Foundation import NSSet, NSMutableSet
def transformWindowData(data):
list1 = []
for v in data:
if not v.valueForKey_('kCGWindowIsOnscreen'):
continue
row = ( \
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') )) \
)
list1.append(row)
return list1;
def printBeautifully(dataSet):
print ('PID'.rjust(7) + ' ' + 'WinID'.rjust(5) + ' ' + 'x,y,w,h'.ljust(21) + ' ' + '\t[Title]:SubTitle')
print ('-'.rjust(7,'-') + ' ' + '-'.rjust(5,'-') + ' ' + '-'.ljust(21,'-') + ' ' + '\t-------------------------------------------')
# print textList1
for v in dataSet:
print (v);
#grab initial set
wl = Quartz.CGWindowListCopyWindowInfo( Quartz.kCGWindowListOptionAll, Quartz.kCGNullWindowID)
wl = sorted(wl, key=lambda k: k.valueForKey_('kCGWindowOwnerPID'))
#convert into readable format
textList1 = transformWindowData(wl);
#print everything we have on the screen
print ('all windows:')
printBeautifully(textList1)
print ('Move target window')
time.sleep(5)
#grab window data the second time
wl2 = Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListOptionAll, Quartz.kCGNullWindowID)
textList2 = transformWindowData(wl2)
#check the difference
w = NSMutableSet.setWithArray_(textList1)
w.minusSet_(NSSet.setWithArray_(textList2))
#print the difference
printBeautifully(w)
Note : Ce script est pour Python 3.x. Je me suis battu avec le script original pendant un certain temps (je ne suis pas un programmeur Python). Je n'arrivais pas à le faire fonctionner (avec 2.x) à cause d'une dépendance de Quartz nécessitant 3.x.
Voici quelques conditions préalables :
pip install pyobjc-framework-Quartz
pip install quartz