我需要帮助将从GetPhysicalMonitorsFromHMONITOR获得的PHYSICAL_MONITOR与监视器DISPLAY_DEVICE.DeviceID(例如:“\?\DISPLAY#GSM59AB#5&932a802&1&UID261#{e6 f07 b5 f-ee 97 - 4a 90-b 076 - 33 f57 bf 4 eaa 7}”),它来自与标志EDD_GET_DEVICE_INTERFACE_NAME一起使用的EnumDisplayDevices,或者以某种方式从DISPLAY_DEVICE.DeviceID获取PHYSICAL_MONITOR,反之亦然。
我需要这两者的关联,因为:
- HANDLE PHYSICAL_MONITOR.hPhysicalMonitor将用于lowlevelmonitorconfigurationapi,因为我需要向监视器发送命令。
- DISPLAY_DEVICE.DeviceID用于使用SetupAPI从注册表中获取EDID结构(前128个字节对我来说足够了,只需要制造商代码和型号)
1和2完成后,问题是将id与物理监视器关联。Also it is possible to get都只使用SetupAPI从注册表监视EDID,但在这种情况下,不可能获得物理监视器HANDLE。
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
我还注意到一件事:以下代码枚举所有监视器:
DWORD DispNum = 0;
DISPLAY_DEVICE DisplayDevice;
// Initialize DisplayDevice.
ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));
DisplayDevice.cb = sizeof(DisplayDevice);
while ((EnumDisplayDevices(NULL, DispNum, &DisplayDevice, 0)))
{
std::wstring deviceName = DisplayDevice.DeviceName;
DISPLAY_DEVICE DisplayDeviceM;
ZeroMemory(&DisplayDeviceM, sizeof(DisplayDeviceM));
DisplayDeviceM.cb = sizeof(DisplayDeviceM);
int monitorIndex = 0;
while (EnumDisplayDevices(deviceName.c_str(), monitorIndex, &DisplayDeviceM, EDD_GET_DEVICE_INTERFACE_NAME))
{
std::wstring monitorID = DisplayDeviceM.DeviceID;
++monitorIndex;
}
DispNum++;
}
与此相同的顺序:
BOOL CALLBACK EnumProc2(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{
LPPHYSICAL_MONITOR pMons = NULL;
DWORD i, mcnt;
MONITORINFOEX mi;
ZeroMemory(&mi, sizeof(mi));
mi.cbSize = sizeof(mi);
GetMonitorInfo(hMonitor, &mi);
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
EnumDisplayDevices(mi.szDevice, 0, &dd, EDD_GET_DEVICE_INTERFACE_NAME);
monitorModelMnufac MdlManuf = findMonitorModelManufactFromEDID(dd.DeviceID);
if (!GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, &mcnt)) return TRUE;
pMons = (LPPHYSICAL_MONITOR)malloc(mcnt * sizeof(PHYSICAL_MONITOR));
if (GetPhysicalMonitorsFromHMONITOR(hMonitor, mcnt, pMons))
for (i = 0; i < mcnt; i++)
{
AddToMonHandles(pMons[i].hPhysicalMonitor, MdlManuf);
}
free(pMons);
return TRUE;
}
物理监视器的HANDLE是0,1,2等等,所以我可以从“monitorIndex”创建HANDLE,但我不确定这样做是否安全。
我还在注册表中查找物理显示器句柄,但没有任何内容。
还发现了一个有用的函数VideoPortDDCMonitorHelper,但正如我在谷歌上搜索的那样,它需要在驱动程序/过滤器中使用,不能从一个简单的可执行文件中使用。
还试图扭转windows dll,所有的调用似乎是从WIN32U.dll和Ghidra不想反编译它,或者我只是在这方面的菜鸟。
帮帮我吧,伙计们:)
3条答案
按热度按时间gudnpqoy1#
我已经寻找了
EnumDisplayDevices
和GetPhysicalMonitorsFromHMONITOR
之间的联系,目的有点类似;我需要每个显示器的唯一ID,以及设置VCP值的能力。一些related posts不给予我信心有一个简单的答案。
我不确定它是否有任何帮助,但我发现ControlMyMonitor很有用。
运行:
为每个显示器生成信息:
您可以轻松设置VCP值。例如,告诉显示器更改为HDMI 1:
此外,如果调用
EnumDisplayMonitors
以获取PHYSICAL_MONITOR.hPhysicalMonitor
,然后将该句柄传递给CapabilitiesRequestAndCapabilitiesReply
,则会产生以下输出:刚好包含了型号。
希望上面的命令产生的一些信息能帮助你实现目标。
祝你好运!
x6492ojm2#
我发现了一些有用的信息,希望对你有帮助。
输出:
然后使用
EnumDisplayMonitors
得到HMONITOR
,并将其用作GetMonitorInfo
的参数。输出:
如果两个输出相同,则它们对应于同一个监视器。最后,我们可以将得到的
HMONITOR
作为GetPhysicalMonitorsFromHMONITOR
的参数,这样我们就可以得到我们需要的hPhysicalMonitor
。2eafrhcq3#
我也有一个困难的时间与这些东西,目前。
我试图找出,哪个是主显示设备的PHYSICAL_MONITOR。
我想更改主显示器的输入源,或者更确切地说是实际的“GetDesktopWindow()”显示器。但是我需要知道它是哪一个,因为同一个HMONITOR用于多个PHYSICAL_MONITOR。
我慢慢地得出结论,这根本不可能。:(