(WMI) 我如何知道哪个显示器连接到哪个图形卡? (C++ 或 C#)
(WMI) How do I know which monitor is connected to which graphics card? (c++ or c#)
我可以用Win32_DesktopMonitor查询所有显示器,用Win32_VideoController查询所有显卡,但我怎么知道哪个显示器连接哪个显卡?
假设我使用 Win32_VideoController 获得两个桌面分辨率,19201080 和 1600900。我有两台显示器,戴尔和惠普。我怎么知道哪个显示器有哪个分辨率?
使用Win32_DesktopMonitor我可以获得ScreenWidth和ScreenHeight,但是如果驱动程序不支持WDDM,这两个值将不存在。而且即使我获得了分辨率,我也无法获得更多信息,例如 Win10 设置。我怎么知道Dell连接的是Display1,VE连接的是Display2?
How could I know that Dell is connected to Display1 and VE is
connected to Display2?
EnumDisplayMonitors 看来是你需要的。
一个简单的C++代码示例,
#include <Windows.h>
#include <iostream>
#include <vector>
#include <cstdio>
std::wstring getMonitorName(HMONITOR monitor) {
DISPLAYCONFIG_TOPOLOGY_ID currentTopologyId;
MONITORINFOEXW info;
info.cbSize = sizeof(info);
GetMonitorInfoW(monitor, &info);
UINT32 requiredPaths, requiredModes;
GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &requiredPaths, &requiredModes);
std::vector<DISPLAYCONFIG_PATH_INFO> paths(requiredPaths);
std::vector<DISPLAYCONFIG_MODE_INFO> modes(requiredModes);
QueryDisplayConfig(QDC_DATABASE_CURRENT, &requiredPaths, paths.data(), &requiredModes, modes.data(), ¤tTopologyId);
for (auto& p : paths) {
DISPLAYCONFIG_SOURCE_DEVICE_NAME sourceName;
sourceName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
sourceName.header.size = sizeof(sourceName);
sourceName.header.adapterId = p.sourceInfo.adapterId;
sourceName.header.id = p.sourceInfo.id;
DisplayConfigGetDeviceInfo(&sourceName.header);
if (wcscmp(info.szDevice, sourceName.viewGdiDeviceName) == 0) {
DISPLAYCONFIG_TARGET_DEVICE_NAME name;
name.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
name.header.size = sizeof(name);
name.header.adapterId = p.sourceInfo.adapterId;
name.header.id = p.targetInfo.id;
DisplayConfigGetDeviceInfo(&name.header);
return std::wstring(name.monitorFriendlyDeviceName);
}
}
return L"";
}
BOOL CALLBACK MyInfoEnumProc(
HMONITOR hMonitor,
HDC hdcMonitor,
LPRECT lprcMonitor,
LPARAM dwData
)
{
MONITORINFOEX mi;
ZeroMemory(&mi, sizeof(mi));
mi.cbSize = sizeof(mi);
GetMonitorInfo(hMonitor, &mi);
wprintf(L"DisplayDevice: %s\n", mi.szDevice);
std::wcout << L"Name: " << getMonitorName(hMonitor) << L"\n";
return TRUE;
}
int main()
{
EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);
return 0;
}
调试:
我可以用Win32_DesktopMonitor查询所有显示器,用Win32_VideoController查询所有显卡,但我怎么知道哪个显示器连接哪个显卡?
假设我使用 Win32_VideoController 获得两个桌面分辨率,19201080 和 1600900。我有两台显示器,戴尔和惠普。我怎么知道哪个显示器有哪个分辨率?
使用Win32_DesktopMonitor我可以获得ScreenWidth和ScreenHeight,但是如果驱动程序不支持WDDM,这两个值将不存在。而且即使我获得了分辨率,我也无法获得更多信息,例如 Win10 设置。我怎么知道Dell连接的是Display1,VE连接的是Display2?
How could I know that Dell is connected to Display1 and VE is connected to Display2?
EnumDisplayMonitors 看来是你需要的。
一个简单的C++代码示例,
#include <Windows.h>
#include <iostream>
#include <vector>
#include <cstdio>
std::wstring getMonitorName(HMONITOR monitor) {
DISPLAYCONFIG_TOPOLOGY_ID currentTopologyId;
MONITORINFOEXW info;
info.cbSize = sizeof(info);
GetMonitorInfoW(monitor, &info);
UINT32 requiredPaths, requiredModes;
GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &requiredPaths, &requiredModes);
std::vector<DISPLAYCONFIG_PATH_INFO> paths(requiredPaths);
std::vector<DISPLAYCONFIG_MODE_INFO> modes(requiredModes);
QueryDisplayConfig(QDC_DATABASE_CURRENT, &requiredPaths, paths.data(), &requiredModes, modes.data(), ¤tTopologyId);
for (auto& p : paths) {
DISPLAYCONFIG_SOURCE_DEVICE_NAME sourceName;
sourceName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
sourceName.header.size = sizeof(sourceName);
sourceName.header.adapterId = p.sourceInfo.adapterId;
sourceName.header.id = p.sourceInfo.id;
DisplayConfigGetDeviceInfo(&sourceName.header);
if (wcscmp(info.szDevice, sourceName.viewGdiDeviceName) == 0) {
DISPLAYCONFIG_TARGET_DEVICE_NAME name;
name.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
name.header.size = sizeof(name);
name.header.adapterId = p.sourceInfo.adapterId;
name.header.id = p.targetInfo.id;
DisplayConfigGetDeviceInfo(&name.header);
return std::wstring(name.monitorFriendlyDeviceName);
}
}
return L"";
}
BOOL CALLBACK MyInfoEnumProc(
HMONITOR hMonitor,
HDC hdcMonitor,
LPRECT lprcMonitor,
LPARAM dwData
)
{
MONITORINFOEX mi;
ZeroMemory(&mi, sizeof(mi));
mi.cbSize = sizeof(mi);
GetMonitorInfo(hMonitor, &mi);
wprintf(L"DisplayDevice: %s\n", mi.szDevice);
std::wcout << L"Name: " << getMonitorName(hMonitor) << L"\n";
return TRUE;
}
int main()
{
EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);
return 0;
}
调试: