如何使用d3dshot获取Windows系统中显示器的真实名称?
获取显示器系统真实名称的解决方案
问题描述
我正在开发一个单显示器截图分析程序,使用d3dshot库,需要获取已连接显示器的系统真实名称(比如"DELL U2419H"这类具体型号)。
当前使用d3dshot的代码:
import d3dshot import time d = d3dshot.create() d.display = d.displays[2] for i, x in enumerate(d.displays): print(i, ". ",x)
运行结果只能得到通用名称:
0 . <Display name=Generic PnP Monitor adapter=NVIDIA GeForce GTX 1060 6GB resolution=1920x1080 rotation=0 scale_factor=1.0 primary=True> 1 . <Display name=Generic PnP Monitor adapter=NVIDIA GeForce GTX 1060 6GB resolution=1824x1026 rotation=0 scale_factor=1.0 primary=False> 2 . <Display name=Generic PnP Monitor adapter=NVIDIA GeForce GTX 1060 6GB resolution=1920x1080 rotation=0 scale_factor=1.0 primary=False>
尝试过screeninfo库,结果也不符合需求:
Monitor(x=1920, y=0, width=1824, height=1026, width_mm=820, height_mm=460, name='\\.\DISPLAY1', is_primary=False) Monitor(x=-1920, y=0, width=1920, height=1080, width_mm=531, height_mm=299, name='\\.\DISPLAY2', is_primary=False) Monitor(x=0, y=0, width=1920, height=1080, width_mm=521, height_mm=293, name='\\.\DISPLAY3', is_primary=True)
请问如何获取显示器的系统真实名称?
解决方案
方法1:使用wmi库读取系统设备信息
wmi可以直接查询Windows的WMI接口,获取显示器的真实型号名称,操作简单直接。
先安装依赖库:
pip install wmi
示例代码:
import wmi c = wmi.WMI() for idx, monitor in enumerate(c.Win32_DesktopMonitor()): print(f"显示器{idx+1}:") print(f" 真实名称: {monitor.Name}") print(f" 制造商&型号: {monitor.MonitorManufacturer} {monitor.MonitorType}") print(f" 分辨率: {monitor.ScreenWidth}x{monitor.ScreenHeight}") print("---")
方法2:使用pywin32解析EDID数据
EDID(Extended Display Identification Data)是显示器内置的标识数据,包含真实型号、制造商等信息,通过pywin32调用Windows API可以解析这些内容。
先安装依赖库:
pip install pywin32
示例代码:
import win32api import win32con import win32gui import win32com.client def parse_edid_manufacturer(edid_data): # 解析EDID中的制造商代码 manufacturer_id = (edid_data[8] << 8) | edid_data[9] return "".join([chr(ord('A') + ((manufacturer_id >> shift) & 0x1F) - 1) for shift in [10,5,0]]) def parse_edid_model(edid_data): # 解析EDID中的型号代码 model_code = (edid_data[10] << 8) | edid_data[11] # 部分厂商型号需要反转字节,这里做通用处理 return hex(model_code)[2:].upper() def get_monitor_real_names(): monitors = [] # 枚举所有显示器句柄 def enum_monitors_callback(hMonitor, hdcMonitor, lprcMonitor, dwData): monitors.append(hMonitor) return True win32gui.EnumDisplayMonitors(None, None, enum_monitors_callback, None) for idx, hMonitor in enumerate(monitors): monitor_info = win32api.GetMonitorInfo(hMonitor) device_name = monitor_info["Device"] # 尝试通过EDID解析真实名称 hdc = win32gui.CreateDC("", device_name, None, None) edid_size = win32api.GetDeviceCaps(hdc, win32con.DEVICECAPS.EDIDSIZE) edid_data = win32api.GetDeviceGammaRamp(hdc) if edid_size >= 128 else None win32gui.DeleteDC(hdc) if edid_data: manufacturer = parse_edid_manufacturer(edid_data) model = parse_edid_model(edid_data) print(f"显示器{idx+1}: {manufacturer} {model}") else: # EDID解析失败时, fallback到WMI查询 wmi_obj = win32com.client.GetObject("winmgmts:").InstancesOf("Win32_DesktopMonitor") for wmi_monitor in wmi_obj: if wmi_monitor.DeviceID == device_name: print(f"显示器{idx+1}: {wmi_monitor.Name}") break get_monitor_real_names()
补充说明
d3dshot和screeninfo这类库聚焦于显示渲染相关的参数,不会读取系统设备的详细标识信息,因此返回的是通用名称或设备路径。- 以上方法仅适用于Windows系统,依赖Windows的WMI接口和系统API。
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

