# from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/460509 import ctypes user = ctypes.windll.user32 class RECT(ctypes.Structure): _fields_ = [ ('left', ctypes.c_long), ('top', ctypes.c_long), ('right', ctypes.c_long), ('bottom', ctypes.c_long), ] def dump(self): return map(int, (self.left, self.top, self.right, self.bottom)) class MONITORINFOEX(ctypes.Structure): _fields_ = [ ('cbSize', ctypes.c_ulong), ('rcMonitor', RECT), ('rcWork', RECT), ('dwFlags', ctypes.c_ulong), ('szDevice', ctypes.ARRAY(ctypes.c_char, 32)), ] def get_monitors(): retval = [] CBFUNC = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_ulong, ctypes.c_ulong, ctypes.POINTER(RECT), ctypes.c_double) def cb(hMonitor, hdcMonitor, lprcMonitor, dwData): r = lprcMonitor.contents # print "cb: %s %s %s %s %s %s %s %s" % (hMonitor, type(hMonitor), hdcMonitor, type(hdcMonitor), lprcMonitor, type(lprcMonitor), dwData, type(dwData)) data = [hMonitor] data.append(r.dump()) retval.append(data) return 1 cbfunc = CBFUNC(cb) temp = user.EnumDisplayMonitors(0, 0, cbfunc, 0) #print temp return retval def monitor_areas(): retval = [] monitors = get_monitors() for hMonitor, extents in monitors: data = {"hMonitor": hMonitor} mi = MONITORINFOEX() mi.cbSize = ctypes.sizeof(MONITORINFOEX) mi.rcMonitor = RECT() mi.rcWork = RECT() res = user.GetMonitorInfoA(hMonitor, ctypes.byref(mi)) for field, fieldtype in MONITORINFOEX._fields_: if fieldtype == RECT: value = {} structvalue = getattr(mi, field) for subfield, subfieldtype in RECT._fields_: value[subfield] = getattr(structvalue, subfield) else: value = getattr(mi, field) data[field] = value retval.append(data) return retval areas = monitor_areas() for i, area in enumerate(areas): print "Monitor %d" % i for key, value in sorted(area.items()): print " %s: %s" % (key, value)