【问题标题】:Get the name of a monitor获取监视器的名称
【发布时间】:2013-11-19 00:07:03
【问题描述】:

我在使用 winapi 检索监视器的名称时遇到了一些麻烦。根据stackoverflow上的其他条目,获取监视器名称的正确方法是:

EnumDisplayDevices(nullptr, 0, &oDisplayDevice, 0);

char lpszDeviceName[32];
memcpy(lpszDeviceName, oDisplayDevice.DeviceName, 32);

EnumDisplayDevices(lpszDeviceName, 0, &oDisplayDevice, 0);

char lpszMonitorName[128];
memcpy(lpszMonitorName, oDisplayDevice.DeviceString, 128);

但是,EnumDisplayDevices 第二次返回FALSE。第一次出现时,DeviceName\\DISPLAY1DeviceString 是 GPU 供应商。使用 MONITORINFOEX 结构可以得到与 DeviceName 相同的值。

明确地说,我正在寻找类似“Samsung blah blah”之类的内容,或者屏幕分辨率页面上控制面板中显示的内容。

【问题讨论】:

  • 您是否将oDisplayDevice.cb 初始化为sizeof(oDisplayDevice)
  • 是的 - 我什至将内存归零并在调用之间重新分配它,但它仍然不起作用。

标签: c++ winapi


【解决方案1】:

这似乎为我返回了正确的数据:

#include <Windows.h>
#include <iostream>
#include <string>

int main()
{
    DISPLAY_DEVICE dd;
    dd.cb = sizeof(dd);
    int deviceIndex = 0;
    while(EnumDisplayDevices(0, deviceIndex, &dd, 0))
    {
        std::string deviceName = dd.DeviceName;
        int monitorIndex = 0;
        while(EnumDisplayDevices(deviceName.c_str(), monitorIndex, &dd, 0))
        {
            std::cout << dd.DeviceName << ", " << dd.DeviceString << "\n";
            ++monitorIndex;
        }
        ++deviceIndex;
    }
    return 0;
}

如果您正在为 UNICODE 进行编译,请改用它:

#include <Windows.h>
#include <iostream>
#include <string>

int main()
{
    DISPLAY_DEVICE dd;
    dd.cb = sizeof(dd);
    int deviceIndex = 0;
    while(EnumDisplayDevices(0, deviceIndex, &dd, 0))
    {
        std::wstring deviceName = dd.DeviceName;
        int monitorIndex = 0;
        while(EnumDisplayDevices(deviceName.c_str(), monitorIndex, &dd, 0))
        {
            std::wcout << dd.DeviceName << L", " << dd.DeviceString << L"\n";
            ++monitorIndex;
        }
        ++deviceIndex;
    }
    return 0;
}

这是一个输出示例:

\.\DISPLAY1\Monitor0,戴尔 U2410(DP)
\.\DISPLAY2\Monitor0,戴尔 2407WFP-HC(数字)

【讨论】:

  • 我仍然一无所获。我正在使用 LPWSTR(或 std::wstring)和函数的 W 版本而不是普通的 LPSTR,这可能是为什么?
  • 嗯...我尝试切换到非宽字符串并得到通用 PnP 监视器,这仅仅是因为没有供应商字符串吗?
  • 我添加了一个 Unicode 示例。对我来说,这会返回我在显示控制面板和设备管理器中看到的相同字符串。据推测,如果您使用监视器的通用驱动程序,那么它将显示通用字符串。
  • 除了通用即插即用之外,几乎所有外接显示器都会是其他东西吗?我试图用它作为在我的程序启动期间区分监视器首选项的一种方式。
  • 很难说。我目前可用的 3 台显示器都有针对它们的特定驱动程序,但我以前见过使用通用驱动程序。我假设除非他们开始围绕设备名称和字符串的组合切换电缆,否则它将是一个唯一标识符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多