Winapi c ++尝试获得主显示器的亮度

时间:2016-11-23 00:05:58

标签: c++ winapi

我尝试使用以下代码获取主显示器的亮度:

    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

1 个答案:

答案 0 :(得分:2)

您正在将HMONITOR传递给该函数。但是,其文档指出需要使用物理监视器的句柄,并建议您调用GetPhysicalMonitorsFromHMONITOR()来获取它。实际上,由于MonitorFromPoint()返回HMONITOR,您的代码将无法在启用STRICT的情况下进行编译,这种做法有助于消除此类错误。

您应该对MonitorFromPoint()的来电添加错误检查。文档还建议您调用GetMonitorCapabilities()传递MC_CAPS_BRIGHTNESS以确保显示器支持亮度请求。

有关更多详细信息,请参阅GetMonitorBrightness()的文档: