Отрегулируйте яркость родным способом в Windows

Мне было интересно, какой нативный способ регулировки яркости в винде?

Под родным я подразумеваю метод, который также отображает наложение яркости в верхнем левом углу в Windows 8, 8.1 и 10, как будто были нажаты специальные клавиши яркости.

Я искал это по всему Интернету, но некоторые решения, которые действительно работают, регулируют яркость, но наложение не отображается. Есть идеи? Есть ли что-то вроде

SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);

который выключает монитор, но для яркости, что можно использовать из C++? Или С#? Спасибо.

Обновление: вот пример кода.

HMONITOR hMonitor = NULL;
DWORD cPhysicalMonitors;
LPPHYSICAL_MONITOR pPhysicalMonitors = NULL;

// Get the monitor handle.
hMonitor = MonitorFromWindow(GetForegroundWindow(), MONITOR_DEFAULTTOPRIMARY);

// Get the number of physical monitors.
BOOL bSuccess = GetNumberOfPhysicalMonitorsFromHMONITOR(
    hMonitor,
    &cPhysicalMonitors
);

if (bSuccess)
{
    // Allocate the array of PHYSICAL_MONITOR structures.
    pPhysicalMonitors = (LPPHYSICAL_MONITOR)malloc(
        cPhysicalMonitors * sizeof(PHYSICAL_MONITOR));

    if (pPhysicalMonitors != NULL)
    {
        // Get the array.
        bSuccess = GetPhysicalMonitorsFromHMONITOR(
            hMonitor, cPhysicalMonitors, pPhysicalMonitors);

        // Use the monitor handles (not shown).
        DWORD pdwMinimumBrightness = 0;
        DWORD pdwCurrentBrightness = 0;
        DWORD pdwMaximumBrightness = 0;

        DWORD dwMonitorCapabilities = 0;
        DWORD dwSupportedColorTemperatures = 0;

        bSuccess = GetMonitorCapabilities(pPhysicalMonitors, &dwMonitorCapabilities, &dwSupportedColorTemperatures);

        cout << bSuccess << endl;

        // Close the monitor handles.
        bSuccess = DestroyPhysicalMonitors(
            cPhysicalMonitors,
            pPhysicalMonitors);

        // Free the array.
        free(pPhysicalMonitors);
    }
}

cout << bSuccess всегда пишет 0 в терминале.

GetMonitorCapabilities завершается с ошибкой -1071241854 (0xC0262582: "Произошла ошибка при передаче данных на устройство по шине I2C."). Тогда как работают клавиши яркости на моем компьютере?


person Valentin Radu    schedule 07.06.2016    source источник
comment
возможный дубликат stackoverflow.com/questions/4013622/   -  person JokingBatman    schedule 07.06.2016
comment
У вас есть это наоборот: это не API управления яркостью, который отображает графический интерфейс. Это приложение с графическим интерфейсом, которое вызывает API для управления яркостью.   -  person IInspectable    schedule 07.06.2016
comment
Хорошо, а как тогда мне отобразить графический интерфейс и управлять им? Поскольку, на самом деле, нет клавиши, определяемой как уменьшение / увеличение яркости, так же, как существует уменьшение / увеличение громкости, поэтому на моем ПК явно есть драйвер, поэтому можно добиться того же с помощью собственного программного обеспечения. В любом случае GetMonitorBrightness не работает для меня по какой-то причине.   -  person Valentin Radu    schedule 07.06.2016
comment
Графический интерфейс автоматический. Установите яркость, и пусть Windows сделает все остальное. Если Get/SetMonitorBrightness не удается, вы должны показать нам код, который вы используете. Желательно в виде минимально воспроизводимого примера   -  person theB    schedule 07.06.2016
comment
Хорошо, я обновил пост кодом, который у меня есть   -  person Valentin Radu    schedule 07.06.2016
comment
Очевидным способом подделки было бы выяснить, какие клавиши соответствуют кнопкам увеличения/уменьшения яркости, а затем имитировать нажатия этих клавиш.   -  person Cody Gray    schedule 07.06.2016
comment
Да, легко сказать, трудно сделать. Это клавиши Fn+F5 и Fn+F6, так что вы не сможете коснуться их из программного обеспечения... Я имею в виду, что они не создают коды клавиш...   -  person Valentin Radu    schedule 07.06.2016
comment
В коде, который вы разместили, я нигде не вижу, где вы называете GetMonitorBrightness   -  person theB    schedule 07.06.2016
comment
извините, GetMonitorCapabilities возвращает ту же ошибку   -  person Valentin Radu    schedule 07.06.2016
comment
Клавиша Fn изменяет коды сканирования, отправляемые аппаратным обеспечением. Поэтому все, что вам нужно сделать, это выяснить, какие скан-коды на самом деле отправляются при нажатии Fn+F5 и Fn+F6. Если эта программа будет работать на любой системе, то аппаратно-зависимый характер скан-кодов явно не проблема.   -  person Cody Gray    schedule 07.06.2016
comment
Я не знаю, Fn генерирует скан-код, но когда я нажимаю F5 и/или F6, ничего не генерируется. Кроме того, я хотел бы, чтобы это работало на любой платформе, а не только на моем ПК. Нет кнопки уменьшения/увеличения яркости. Вероятно, у меня есть драйвер на моем ПК, который действует, когда методы для Fn + F5 и Fn + F6 происходят в DSDT, а затем драйвер выполняет всю работу по переключению яркости и как-то показывает наложение. Ни у кого нет подсказки? Даже если GetMonitorCapabilities не работает в моей системе, что-то должно, я могу четко изменить яркость своего экрана.   -  person Valentin Radu    schedule 07.06.2016
comment
Что касается ошибки при вызове функции, см. ответ Ханса Пассанта здесь Клавиши FN+, вероятно, работают через один из системных драйверов или изменение настроек оборудования напрямую, на что Windows просто реагирует.   -  person theB    schedule 07.06.2016
comment
Хорошо, но я все еще могу использовать приложение, такое как nircmd от NirSoft, для изменения яркости, так что ее явно можно как-то изменить ... Жаль, что в Windows нет стандартного способа, который работает все время.   -  person Valentin Radu    schedule 08.06.2016
comment
В Windows есть стандартный способ. Вы уже нашли ее: функцию SetMonitorBrightness. Проблема в ваших аппаратных драйверах. Последний оставшийся вариант, который я могу придумать, — использовать WMI. Это вполне может быть тем, что делает NirSoft. блоги .technet.microsoft.com/heyscriptingguy/2013/07/25/ Конечно, по-прежнему требуется аппаратная поддержка. Попробуйте и посмотрите, повезет ли вам.   -  person Cody Gray    schedule 08.06.2016