我需要帮助将我从GetPhysicalMonitorsFromHMONITOR获得的 PHYSICAL_MONITOR 与显示器 DISPLAY_DEVICE.DeviceID 关联起来(例如“\?\DISPLAY#GSM59AB#5&932a802&1&UID261#{e6f07b5f-ee97-4a90- b076-33f57bf4eaa7 }”),它来自EnumDisplay_INTERACEF57bf4eaa7 }” ,或者以某种方式从 DISPLAY_DEVICE.DeviceID 获取 PHYSICAL_MONITOR,反之亦然。
我需要将它们都关联起来,因为:
HANDLE PHYSICAL_MONITOR.hPhysicalMonitor 将用于低级监视器配置api,因为我需要向监视器发送命令。
DISPLAY_DEVICE.DeviceID 用于使用 SetupAPI 从注册表中获取 EDID 结构(前 128 个字节对我来说就足够了,只需要制造商代码和型号)
1 和 2 已完成,问题是将 id 与物理监视器相关联。 也可以仅使用 SetupAPI 从注册表中获取所有监视器 EDID,但在这种情况下,无法获取物理监视器 HANDLE。
MSDN上的相同问题,未解决((
我还注意到一件事:此代码枚举所有监视器:
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,但我不确定这样做是否安全。
我还在注册表中查找了物理监视器 HANDLE,但那里什么也没有。
还发现了对VideoPortDDCMonitorHelper很有帮助的功能,但正如我搜索的那样,它需要在驱动程序/过滤器中使用,并且不能从简单的可执行文件中使用。
还尝试反转 Windows dll,所有调用似乎都是从 WIN32U.dll 进行的,Ghidra 不想反编译它,或者我只是菜鸟。
请帮帮我:)