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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:20:23