Изменение громкости без создания уведомления для IAudioEndpointVolume

0

Я написал приложение C++, которое работает как служба Windows, чтобы ограничить объем компьютера под управлением Windows 7. Пользователь может указать разные правила для разных дней и времени, и служба плавно изменит громкость. Для реализации этого я использую интерфейс IAudioEndpointVolume. В общем, он работает, как и предполагалось...

Тем не менее, существует странное поведение, которое я пока не могу объяснить. При переключении пользователей объем внезапно падает, но он не генерирует уведомления, как можно было бы ожидать. Также странно, что слайдеры в SndVol.exe показывают правильное значение для тома. Из-за отсутствующего уведомления моя программа не может реагировать на это изменение, и в результате он больше не может выполнять свои намерения. Я обнаружил, что громкость снова вернется к правильному громкости, если я немного переместил ползунок громкости. Конечно, это генерирует уведомление, которое будет обрабатываться моей службой. Затем мое обслуживание принудительно установит правильный объем.

Я не понимаю, почему этот том изменяется без видимости в SndVol.exe и без создания уведомления. Переход к первой учетной записи пользователя не решает проблему. Даже после выхода из системы громкость все еще находится на неправильном уровне.

Насколько я видел, документация об интерфейсе IAudioEndpointVolume не упоминает ничего о разном сеансе пользователя.

Любые идеи о том, что может вызвать эту проблему или что я могу попытаться исправить?

Теги:
windows-services
volume

2 ответа

0
Лучший ответ

Ну, через некоторое время я уверен, что изменение объема вызвано драйвером третьей стороны, который мы используем. У этого драйвера есть собственный механизм контроля громкости. Я больше не испытываю изменений после того, как только начал управлять GUI драйверов. Даже после перезапуска проблема кажется исправленной. Однако через некоторое время он снова сломается по той причине, которую я не могу понять. Но это произошло только потому, что некоторые параметры безопасности не позволяли графическому интерфейсу управления драйверами запускаться при входе в систему как не admin. Я исправил это сейчас и ожидаю, что все будет работать сейчас.

Кроме того, похоже, что все сеансы пользователей используют один и тот же регулятор громкости. Это означает, что если я изменяю том с SndVol в одном сеансе пользователя, то такое же изменение происходит и в другом сеансе пользователя. Моя служба получает уведомления обо всех этих изменениях. Таким образом, похоже, что я не получал уведомления при переключении между пользователями, потому что изменение было вызвано GUI драйвера, начиная с входа в систему как администратор. Но это изменение произошло в драйвере, на нижнем уровне, так что Windows не знает об изменениях.

Драйвер, который мы используем, это kX Audio Driver.

1

Ваша служба запускается в сеансе 0, изолированном сеансе, который предотвращает использование вредоносных программ при атаках. Рабочий стол пользователя запускается в другом сеансе, может быть несколько. Документация WASAPI умалчивает о том, как звуковой сеанс сопоставляется в сеансах Windows. У вас очень сильный намек на то, что это не так, как он себя ведет.

В разделе есть зловещие слова, в которых говорится о параметрах группировки. Конструкция, которая в основном существует, чтобы позволить Sndvol идентифицировать процессы, которые используют один и тот же контроль объема. Он цитирует Explorer как пример, процесс, который можно запустить несколько раз, но все еще имеет один регулятор громкости. Процесс, который не хочет делиться, использует идентификатор сеанса GUID_NULL для выбора сеанса по умолчанию в IAudioSessionControl :: SetGroupingParam() или просто опускает вызов вообще, поскольку это значение по умолчанию.

И поведение Sndvol, оно отображает только элементы управления томами для процессов, которые выполняются в сеансе рабочего стола. Вы не можете видеть процессы в другом сеансе рабочего стола. Давая очень сильный намек на то, что аудио-сессия GUID_NULL специфична для сеанса, в котором она была создана.

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

Вместо этого рассмотрите возможность запуска вашей программы как обычного процесса без окон, который выполняется в сеансе рабочего стола пользователя. Начало работы с помощью раздела "Запустить раздел реестра" или ярлыка папки "Автозагрузка" или планировщика задач.

  • 0
    Разве это не противоречит тому факту, что мой сервис получает уведомления, например, об изменениях, вносимых пользователем в том в SndVol? Почему Windows меняет громкость при переключении пользователей вообще? И почему громкость не восстанавливается после переключения обратно?
  • 0
    Похоже, что изменение громкости вызвано драйвером стороннего производителя, который мы используем. По крайней мере, я больше не испытываю изменения после запуска графического интерфейса управления драйверами. Даже после перезагрузки проблема кажется исправленной. Кроме того, похоже, что все пользовательские сеансы имеют один и тот же регулятор громкости. Это означает, что если я меняю том с помощью SndVol в одном сеансе пользователя, то же самое изменение происходит в другом сеансе пользователя. Мой сервис получает уведомления обо всех этих изменениях. Таким образом, похоже, что я не получил уведомление раньше, потому что изменения произошли в драйвере, нижний уровень.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню