You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过脚本获取打印机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}")

为什么这个方案能解决你的问题?

  1. 零额外依赖:只用Python自带的ctypes库,不需要安装pywin32、WMI模块,也不用纠结MSVC Redistributables的版本问题,完全适配受限办公环境。
  2. 底层直接调用:GetDeviceCaps是Windows GDI的核心函数,直接读取显示器硬件的物理属性,比WMI、win32ui的封装更可靠,不会出现参数缺失的情况。
  3. 支持多显示器:脚本会自动枚举所有连接的显示器,每个设备的参数都能单独获取。

小提示

如果只需要主显示器的参数,直接取monitor_params[0]即可;运行脚本不需要管理员权限(除非你的办公设备有特殊权限限制,一般普通用户权限就能正常执行)。

内容的提问来源于stack exchange,提问作者alfadog67

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:28:02