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

StackOverflow https://stackoverflow.com/questions/2175318

Вопрос

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

Есть ли настройка реестра для него, как Sound Manager в Window XP?

Какой API это делает?

Это было полезно?

Решение

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

Сказав это, если вы ищете в Интернете, есть ряд людей, которые обратного зависят от API, которые используются в Windows Vista, чтобы сделать это, но я не собираюсь указывать на них (обратное спроектировано API неподдерживаемые API и могут измениться без уведомления от Microsoft). Вы используете эти решения на своем собственном опасности.

Другие советы

Системный лоток аудиоустройство коммутатор использует "Software\Microsoft\Multimedia\Sound Mapper", "Playback" Чтобы установить индекс звукового устройства, который был получен путем перечисления устройств.mcisendcommand. из "winmm.dll" также используется

В этом исходный код Вы найдете клавиши реестра, используемые для достижения этого.

Если это не работает, вы могли бы дать Процесс монитор Попробуйте и следить за всеми видами действий реестра Windows, когда вы изменяете устройство по умолчанию. На моем Vista установка панели управления Twidddles с "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\"

Для Vista видетьhttp://www.vistaaudiochanger.com/

Я действительно не знаю, если кому-то все еще нужно это, но вот мое решение. На самом деле, это для устройства захвата, но его можно легко изменить в устройство рендера.

Он устанавливает 3 значения реестра в клавише устройства в текущее время. Магия, но вот как это работает. Примечание: проверено только на Win7 x64

void SetDefaultRecordDevice(tstring strDeviceName){
    const int BUFF_LEN = 260;
    //HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Capture\{79434968-09f6-4dff-8086-c5e618b21473}\Role:0:
    //"DE 07 08 00 06 00 10 00 15 00 38 00 1E 00 48 03"
    HKEY hkCaptureDevices;
    RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\MMDevices\\Audio\\Capture") , 0, KEY_ENUMERATE_SUB_KEYS | KEY_WOW64_64KEY, &hkCaptureDevices);
    TCHAR lpwstrDeviceGuidKey[BUFF_LEN];
    DWORD dwDeviceGuidKeySize = BUFF_LEN;
    for(int i=0;RegEnumKeyEx(hkCaptureDevices, i, lpwstrDeviceGuidKey, &dwDeviceGuidKeySize, 0, 0, 0, 0) != ERROR_NO_MORE_ITEMS; ++i){
        dwDeviceGuidKeySize = BUFF_LEN;
        HKEY hkProps;
        RegOpenKeyEx(hkCaptureDevices, (tstring(lpwstrDeviceGuidKey) + _T("\\Properties")).c_str() , 0, KEY_READ | KEY_WOW64_64KEY, &hkProps);
        TCHAR data[BUFF_LEN];
        DWORD dwDataSize = BUFF_LEN;
        if(RegQueryValueEx(hkProps, _T("{a45c254e-df1c-4efd-8020-67d146a850e0},2"), 0, 0, (LPBYTE)data, &dwDataSize) !=  ERROR_SUCCESS){
            continue;
        } else {
            tstring strCurrentDeviceName(data);
            // TODO név általánosítás
            if(strDeviceName == strCurrentDeviceName){
                HKEY hkGuid;
                RegOpenKeyEx(hkCaptureDevices, lpwstrDeviceGuidKey , 0, KEY_READ | KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_WOW64_64KEY | KEY_NOTIFY , &hkGuid);

                time_t CurrentTime;
                time(&CurrentTime);

                time_t     now = time(0);
                struct tm  tstruct;


                gmtime_s(&tstruct, &now);
                // Visit http://en.cppreference.com/w/cpp/chrono/c/strftime
                // for more information about date/time format

                char CustomRegistryDateValue[16];

                WORD year = tstruct.tm_year + 1900;
                WORD month = tstruct.tm_mon+1;
                WORD dayOfTheWeek = tstruct.tm_wday;
                WORD day = tstruct.tm_mday;
                WORD hour = tstruct.tm_hour;
                WORD minute = tstruct.tm_min;
                WORD second = tstruct.tm_sec;
                WORD millisec = 0x0; // hasrautés

                int k = 0;
                *((WORD*)CustomRegistryDateValue + k++) = year;
                *((WORD*)CustomRegistryDateValue + k++) = month;
                *((WORD*)CustomRegistryDateValue + k++) = dayOfTheWeek;
                *((WORD*)CustomRegistryDateValue + k++) = day;
                *((WORD*)CustomRegistryDateValue + k++) = hour;
                *((WORD*)CustomRegistryDateValue + k++) = minute;
                *((WORD*)CustomRegistryDateValue + k++) = second;
                *((WORD*)CustomRegistryDateValue + k++) = millisec;

                RegSetValueExA(hkGuid, ("Role:0"), 0, REG_BINARY, (LPBYTE)CustomRegistryDateValue, 16);
                RegSetValueExA(hkGuid, ("Role:1"), 0, REG_BINARY, (LPBYTE)CustomRegistryDateValue, 16);
                RegSetValueExA(hkGuid, ("Role:2"), 0, REG_BINARY, (LPBYTE)CustomRegistryDateValue, 16);
                RegFlushKey(hkGuid);
                RegCloseKey(hkGuid);
            }
        }
        RegCloseKey(hkProps);
    }
    RegCloseKey(hkCaptureDevices);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top