我尝试使用以下代码获取主显示器的亮度:
POINT monitorPoint = { 0, 0 };
HANDLE monitor = MonitorFromPoint(monitorPoint, MONITOR_DEFAULTTOPRIMARY);
DWORD minb, maxb, currb;
if (GetMonitorBrightness(monitor, &minb, &currb, &maxb) == FALSE) {
std::cout << GetLastError() << std::endl;
}
但它失败,GetLastError()
返回87
,这意味着Invalid Parameter
。
编辑:我设法使用EnumDisplayMonitors()
和GetPhysicalMonitorsFromHMONITOR()
解决了这个问题:
std::vector<HANDLE> pMonitors;
BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) {
DWORD npm;
GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, &npm);
PHYSICAL_MONITOR *pPhysicalMonitorArray = new PHYSICAL_MONITOR[npm];
GetPhysicalMonitorsFromHMONITOR(hMonitor, npm, pPhysicalMonitorArray);
for (unsigned int j = 0; j < npm; ++j) {
pMonitors.push_back(pPhysicalMonitorArray[j].hPhysicalMonitor);
}
delete pPhysicalMonitorArray;
return TRUE;
}
// and later inside main simply:
EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, NULL);
// and when I need to change the brightness:
for (unsigned int i = 0; i < pMonitors.size(); ++i) {
SetMonitorBrightness(pMonitors.at(i), newValue);
}
现在我遇到了两个新问题:
1)从EnumDisplayMonitors()
我得到2个监视器句柄,因为我有2个监视器。问题是只有我的主要工作。每当我尝试使用辅助监视器时,我都会收到此错误:
0xC0262582:ERROR_GRAPHICS_I2C_ERROR_TRANSMITTING_DATA
2)使用SetMonitorBrightness()
一段时间后,即使是主监视器也停止工作,我收到以下错误:
0xC026258D
答案 0 :(得分:2)
您正在将HMONITOR
传递给该函数。但是,其文档指出需要使用物理监视器的句柄,并建议您调用GetPhysicalMonitorsFromHMONITOR()
来获取它。实际上,由于MonitorFromPoint()
返回HMONITOR
,您的代码将无法在启用STRICT
的情况下进行编译,这种做法有助于消除此类错误。
您应该对MonitorFromPoint()
的来电添加错误检查。文档还建议您调用GetMonitorCapabilities()
传递MC_CAPS_BRIGHTNESS
以确保显示器支持亮度请求。
有关更多详细信息,请参阅GetMonitorBrightness()
的文档: