Библиотека C++ DXVA Операция завершилась неудачно, так как сообщение DDC/CI содержало недопустимое значение в поле команды.

Я пытаюсь создать консольное приложение C++, которое будет автоматически регулировать яркость моего монитора в зависимости от средней яркости пикселей, отображаемых на моем экране. К сожалению, еще до того, как я добрался до второй части, у меня возникли проблемы даже с использованием библиотеки DXVA.

Вот мой текущий код (часть которого я взял отсюда: Как используйте функции GetMonitorCapabilities и GetMonitorBrightness):

#include "stdafx.h"
#include <iostream>

#include <Windows.h>
#include <WinUser.h>
#include <physicalmonitorenumerationapi.h>
#include <highlevelmonitorconfigurationapi.h>
#include <strsafe.h>

std::string GetLastErrorAsString()
{
    DWORD errorMessageID = ::GetLastError();
    if (errorMessageID == 0)
        return std::string();

    LPSTR messageBuffer = nullptr;
    size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);

    std::string message(messageBuffer, size);
    LocalFree(messageBuffer);

    return message;
}

int main()
{
    HWND hWnd = GetDesktopWindow();
    HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTOPRIMARY);
    DWORD cPhysicalMonitors = 0;

    BOOL bSuccess = GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, &cPhysicalMonitors);
    if (!bSuccess) {
        std::cout << "An error occured: " << GetLastErrorAsString().c_str() << std::endl;
    }
    LPPHYSICAL_MONITOR pPhysicalMonitors = (LPPHYSICAL_MONITOR)malloc(cPhysicalMonitors * sizeof(PHYSICAL_MONITOR));

    if (bSuccess)
    {
        if (pPhysicalMonitors != NULL)
        {
            bSuccess = GetPhysicalMonitorsFromHMONITOR(hMonitor, cPhysicalMonitors, pPhysicalMonitors);

            if (!bSuccess) {
                std::cout << "An error occured: " << GetLastErrorAsString().c_str() << std::endl;
            }

            HANDLE hPhysicalMonitor = pPhysicalMonitors[0].hPhysicalMonitor;

            DWORD dwMinimumBrightness = 0;
            DWORD dwCurrentBrightness = 0;
            DWORD dwMaximumBrightness = 0;

            DWORD dwMonitorCapabilities = 0;
            DWORD dwSupportedColorTemperatures = 0;
            bSuccess = GetMonitorCapabilities(hPhysicalMonitor, &dwMonitorCapabilities, &dwSupportedColorTemperatures);

            if (bSuccess) {
                std::cout << "Capabilities: " << dwMonitorCapabilities << std::endl << "Supported color temperatures: " << dwSupportedColorTemperatures << std::endl;
            }
            else {
                std::cout << "An error occured while getting monitor capabilities: " << GetLastErrorAsString().c_str() << std::endl;
            }

            bSuccess = GetMonitorBrightness(hPhysicalMonitor, &dwMinimumBrightness, &dwCurrentBrightness, &dwMaximumBrightness);

            if (bSuccess) {
                std::cout << "Minimum brightness: " << dwMinimumBrightness << std::endl << "Maximum brightness: " << dwMaximumBrightness << std::endl << "Current brightness: " << dwCurrentBrightness << std::endl;
            }
            else {
                std::cout << "An error occured while getting brightness: " << GetLastErrorAsString().c_str() << std::endl;
            }

            bSuccess = DestroyPhysicalMonitors(cPhysicalMonitors, pPhysicalMonitors);

            free(pPhysicalMonitors);
        }
    }
    return 0;
}

Ошибка, которую я получаю для функций яркости/возможностей, такова: An operation failed because a DDC/CI message had an invalid value in its command field.

Я часами гуглил, и мне еще предстоит найти какое-то решение для моей проблемы. У меня есть графическая карта AMD, и я использую встроенные драйверы (драйверы Google Lenovo e545 AMD), которые включают Catalyst версии 15.7.1, Direct3D 9.14.10.01128 и версию драйвера 15.20.1062.1004-150803a1-187674C.

Прошу прощения за сумбурный вопрос и отсутствие опыта.


person Hexcede    schedule 29.04.2018    source источник
comment
Это всего лишь предположение, но вы компилируете в 32-битном или 64-битном режиме? Я спрашиваю, потому что подпись функции требует LPDWORD в качестве параметров. Длина аргумента указателя варьируется в зависимости от цели сборки, что, возможно, объясняет это, хотя я ожидаю, что ваш код будет работать также.   -  person StarShine    schedule 20.08.2018
comment
Ваш код отлично работает для меня, x86 или x64. Возможно, проблема в вашем мониторе или способе его подключения к вашей системе (разъемы, кабели). Вы можете использовать этот инструмент entechtaiwan.com/lib/softmccs.shtm, чтобы проверить номер вещей и испытаний на соответствие.   -  person Simon Mourier    schedule 22.08.2018