你可以使用
连接和配置显示器 (CCD) API,特别是
The QueryDisplayConfig function函数,该函数检索当前设置中所有显示设备或视图的所有可能显示路径的信息。
使用以下代码,您将获得设备路径和监视器(及其句柄)之间的对应关系。
#include <Windows.h>
#include <stdio.h>
#include <vector>
#include <tuple>
#include <string>
int main()
{
UINT pathCount;
UINT modeCount;
if (GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &pathCount, &modeCount))
return 0;
std::vector<DISPLAYCONFIG_PATH_INFO> paths(pathCount);
std::vector<DISPLAYCONFIG_MODE_INFO> modes(modeCount);
if (QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &pathCount, paths.data(), &modeCount, modes.data(), nullptr))
return 0;
std::vector<std::tuple<HMONITOR, std::wstring>> monitors;
EnumDisplayMonitors(nullptr, nullptr, [](HMONITOR hmon, HDC hdc, LPRECT rc, LPARAM lp)
{
MONITORINFOEX mi = {};
mi.cbSize = sizeof(MONITORINFOEX);
GetMonitorInfo(hmon, &mi);
auto monitors = (std::vector<std::tuple<HMONITOR, std::wstring>>*)lp;
monitors->push_back({ hmon, mi.szDevice });
return TRUE;
}, (LPARAM)&monitors);
for (UINT i = 0; i < pathCount; i++)
{
DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName = {};
deviceName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
deviceName.header.size = sizeof(DISPLAYCONFIG_TARGET_DEVICE_NAME);
deviceName.header.adapterId = paths[i].targetInfo.adapterId;
deviceName.header.id = paths[i].targetInfo.id;
if (DisplayConfigGetDeviceInfo((DISPLAYCONFIG_DEVICE_INFO_HEADER*)&deviceName))
continue;
wprintf(L"Monitor Friendly Name : %s\n", deviceName.monitorFriendlyDeviceName);
wprintf(L"Monitor Device Path : %s\n", deviceName.monitorDevicePath);
DISPLAYCONFIG_SOURCE_DEVICE_NAME sourceName = {};
sourceName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
sourceName.header.size = sizeof(DISPLAYCONFIG_SOURCE_DEVICE_NAME);
sourceName.header.adapterId = paths[i].targetInfo.adapterId;
sourceName.header.id = paths[i].sourceInfo.id;
if (DisplayConfigGetDeviceInfo((DISPLAYCONFIG_DEVICE_INFO_HEADER*)&sourceName))
continue;
wprintf(L"GDI Device Name : %s\n", sourceName.viewGdiDeviceName);
auto mon = std::find_if(monitors.begin(), monitors.end(), [&sourceName](std::tuple<HMONITOR, std::wstring> t)
{
return !std::get<1>(t).compare(sourceName.viewGdiDeviceName);
});
wprintf(L"Monitor Handle : %p\n", std::get<0>(*mon));
wprintf(L"\n");
}
return 0;
}
在我的电脑上(有两个显示器),它将输出类似于这样的内容:
Monitor Friendly Name : C27HG7x
Monitor Device Path : \\?\DISPLAY#SAM0E16#7&307b5912&0&UID1024#
GDI Device Name : \\.\DISPLAY2
Monitor Handle : 0000000000160045
Monitor Friendly Name : DELL U2715H
Monitor Device Path : \\?\DISPLAY#DELD069#7&307b5912&0&UID1028#
GDI Device Name : \\.\DISPLAY1
Monitor Handle : 0000000000020083
请注意,您也可以使用WinRT的
DisplayManager类 =>
DisplayView类 =>
Paths属性,
DisplayPath类 =>
Target属性 =>
TryGetMonitor函数获取相同的信息。保留HTML标签。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wisp\Pen\Digimon
- usbpc102