Как я могу уведомить свое приложение об изменении устройства воспроизведения звука по умолчанию?

У меня есть две звуковые карты на моем компьютере с Windows XP SP3, и я написал приложение на C++, с помощью которого я меняю устройство воспроизведения по умолчанию, редактируя следующую запись реестра:

regKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Multimedia\Sound Mapper", true);

Мое приложение изменяет значение клавиши "Воспроизведение" в целях использования первой или второй звуковой карты в качестве устройства воспроизведения по умолчанию.

Проблема в том, что когда я меняю устройство по умолчанию, приложение все еще использует старое (которое было установлено по умолчанию при запуске программы). Если после изменения я снова запускаю приложение, все работает нормально, и я могу использовать "новое" устройство воспроизведения по умолчанию.

Как я могу "сказать" для моего приложения, что я изменил устройство по умолчанию? Каким образом приложение считывает и сохраняет переменную при запуске, какое звуковое устройство по умолчанию в Windows? Есть ли решение для моей проблемы?

1 ответ

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

Также учтите, что подобные вещи могут измениться в более поздних версиях Windows. Если вы когда-нибудь решите обновить систему до Windows Vista или 7, вы вернетесь сюда снова и зададите больше вопросов, потому что ваше приложение для переключения звука больше не будет работать. Более поздние версии обрабатывают аудиоустройства совсем иначе, чем в XP; для начала, они теперь основаны на API Core Audio.

Поэтому по понятным причинам изменение параметров реестра не является предпочтительным способом изменения конфигурации вашего компьютера.

Но если вы просто пытаетесь уведомить конкретное приложение о том, что вы изменили значение в реестре, простое решение - это RegNotifyChangeKeyValue функция По сути, это подписывает приложение на получение уведомлений каждый раз, когда изменяется значение конкретного раздела реестра.

Правильное решение для Windows Vista и более поздних версий доступно здесь.

Другие вопросы по тегам