如何通过脚本获取打印机PHYSICALOFFSETX等物理参数?
获取显示器物理参数的替代方案(无需额外依赖)
看来你在办公楼的受限环境里踩了不少坑——win32ui依赖搞不定、WMI拿不到目标参数、VBS/WSH也没辙,还不能用PowerShell,那咱们换个纯Python内置库的路子,用ctypes直接调用Windows原生API,完全不需要额外安装任何依赖,应该能绕过那些环境限制。
核心思路
Windows的user32.dll和gdi32.dll里的原生函数可以直接获取显示器的物理属性,咱们用ctypes封装调用这些API,就能精准拿到你要的PHYSICALOFFSETX(112)、PHYSICALOFFSETY(113)、PHYSICALWIDTH(110)、PHYSICALHEIGHT(111)参数。
完整脚本代码
import ctypes from ctypes import wintypes # 绑定Windows系统DLL并定义所需结构体 user32 = ctypes.WinDLL('user32', use_last_error=True) gdi32 = ctypes.WinDLL('gdi32', use_last_error=True) class RECT(ctypes.Structure): _fields_ = [ ('left', wintypes.LONG), ('top', wintypes.LONG), ('right', wintypes.LONG), ('bottom', wintypes.LONG) ] class MONITORINFOEXW(ctypes.Structure): _fields_ = [ ('cbSize', wintypes.DWORD), ('rcMonitor', RECT), ('rcWork', RECT), ('dwFlags', wintypes.DWORD), ('szDevice', wintypes.WCHAR * 32) ] # 定义显示器枚举回调函数的类型 MONITORENUMPROC = ctypes.WINFUNCTYPE( wintypes.BOOL, wintypes.HMONITOR, wintypes.HDC, ctypes.POINTER(RECT), wintypes.LPARAM ) # 声明API函数的参数和返回值类型 user32.EnumDisplayMonitors.argtypes = [ wintypes.HDC, ctypes.POINTER(RECT), MONITORENUMPROC, wintypes.LPARAM ] user32.GetMonitorInfoW.argtypes = [wintypes.HMONITOR, ctypes.POINTER(MONITORINFOEXW)] user32.GetDC.argtypes = [wintypes.HWND] user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] gdi32.GetDeviceCaps.argtypes = [wintypes.HDC, wintypes.INT] # 存储所有显示器参数的列表 monitor_params = [] def enum_monitor_callback(hMonitor, hdcMonitor, lprcMonitor, dwData): # 获取显示器基础信息 monitor_info = MONITORINFOEXW() monitor_info.cbSize = ctypes.sizeof(MONITORINFOEXW) if not user32.GetMonitorInfoW(hMonitor, ctypes.byref(monitor_info)): return True # 获取设备上下文并读取物理参数 hdc = user32.GetDC(None) if hdc: params = { '设备名称': monitor_info.szDevice, 'PHYSICALWIDTH(110)': gdi32.GetDeviceCaps(hdc, 110), 'PHYSICALHEIGHT(111)': gdi32.GetDeviceCaps(hdc, 111), 'PHYSICALOFFSETX(112)': gdi32.GetDeviceCaps(hdc, 112), 'PHYSICALOFFSETY(113)': gdi32.GetDeviceCaps(hdc, 113) } monitor_params.append(params) user32.ReleaseDC(None, hdc) return True # 启动显示器枚举 user32.EnumDisplayMonitors(None, None, MONITORENUMPROC(enum_monitor_callback), 0) # 打印结果 for idx, params in enumerate(monitor_params, 1): print(f"=== 显示器 {idx} 参数 ===") for key, value in params.items(): print(f"{key}: {value}")
为什么这个方案能解决你的问题?
- 零额外依赖:只用Python自带的
ctypes库,不需要安装pywin32、WMI模块,也不用纠结MSVC Redistributables的版本问题,完全适配受限办公环境。 - 底层直接调用:
GetDeviceCaps是Windows GDI的核心函数,直接读取显示器硬件的物理属性,比WMI、win32ui的封装更可靠,不会出现参数缺失的情况。 - 支持多显示器:脚本会自动枚举所有连接的显示器,每个设备的参数都能单独获取。
小提示
如果只需要主显示器的参数,直接取monitor_params[0]即可;运行脚本不需要管理员权限(除非你的办公设备有特殊权限限制,一般普通用户权限就能正常执行)。
内容的提问来源于stack exchange,提问作者alfadog67
相关产品推荐
相关产品推荐

