2017-05-28 26 views
2

当前工作区中的所有窗口的下面的Python 2代码打印清单:如何在Mac上的Python中列出所有工作区中的所有窗口?

#!/usr/bin/python 
import Quartz 
for window in Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListOptionOnScreenOnly, Quartz.kCGNullWindowID): 
    print("%s - %s" % (window['kCGWindowOwnerName'], window.get('kCGWindowName', u'Unknown').encode('ascii','ignore'))) 

虽然不打印这是在全屏幕应用程序(因为它是在另一个工作区)。

如何修改上述脚本以列出所有桌面上的所有窗口?

回答

2

下面的脚本应该返回任何桌面/工作区/显示器,全屏,并详细信息窗口信息(坐标,PID,标题等):

#!/usr/bin/python 

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

def windowList(wl): 
    for v in wl: 
     print ( 
     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 '')) 
     ).encode('utf8') 

wl1 = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID) 
print('Move target window (or ignore)\n') 
time.sleep(5) 

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

wl2 = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID) 

w = NSMutableSet.setWithArray_(wl1) 
w.minusSet_(NSSet.setWithArray_(wl2)) 

wl = Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListOptionAll, Quartz.kCGNullWindowID) 
wl = sorted(wl, key=lambda k: k.valueForKey_('kCGWindowOwnerPID')) 

windowList(wl) 

print('\nDetailed window information: {0}\n'.format(w)) 
1

的关键是这里使用权选项CGWindowListCopyWindowInfo的第一个参数。因此,除了使用optionOnScreenOnly属性(列出当前屏幕上的所有窗口)之外,还需要添加excludeDesktopElements属性。

excludeDesktopElements:从列表中排除桌面元素(包括背景图片和桌面图标)中的任何窗口。

例如,

list = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements & kCGWindowListOptionOnScreenOnly, kCGNullWindowID) 

或者所有窗口,也可以用kCGWindowListOptionAll财产。

kCGWindowListOptionAll:列出所有窗口,包括屏​​幕上和屏幕外的窗口。使用此选项检索列表时,应将relativeToWindow参数设置为kCGNullWindowID

对于其他属性,请检查CGWindow.h in CoreGraphics


所以原代码可以改为:

#!/usr/bin/python 
# Prints list of all windows. 
# See: https://stackoverflow.com/q/44232433/55075 
import Quartz 
for window in Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListOptionOnScreenOnly & Quartz.kCGWindowListExcludeDesktopElements, Quartz.kCGNullWindowID): 
    print("%s - %s" % (window['kCGWindowOwnerName'], window.get('kCGWindowName', u'Unknown').encode('ascii','ignore'))) 
相关问题