Как изменить стандартное звуковое устройство по умолчанию для воспроизведения и записи в Vista?
Есть ли какой-либо параметр реестра для него, как звуковой менеджер в окне XP?
Какой API это делает?
Как изменить стандартное звуковое устройство по умолчанию для воспроизведения и записи в Vista?
Есть ли какой-либо параметр реестра для него, как звуковой менеджер в окне XP?
Какой API это делает?
Нет общедоступного API, который позволяет вам изменять звуковое устройство по умолчанию, которое является функциональностью, которая, как полагают, находится под контролем пользователей. Это всегда имело место в Windows.
Сказав, что, если вы ищете в Интернете, есть несколько людей, у которых есть обратная инженерия API, которые используются в Windows Vista для этого, но я не буду указывать на них (обратный инженерный API-интерфейсы являются внутренними неподдерживаемыми API-интерфейсами и могут быть изменены без уведомления от Microsoft). Вы используете эти решения на свой страх и риск.
Системный лоток Audio Device Switcher использует "Software\Microsoft\Multimedia\Sound Mapper", "Playback"
для установки индекса звукового устройства, которое было получено путем перечисления устройств.
mciSendCommand из "winmm.dll" также используется
В этом исходном коде вы найдете ключи реестра, используемые для этого.
Если это не сработает, вы можете дать Process Monitor попробовать и контролировать все действия реестра в Windows при изменении устройства по умолчанию. На моей установке Vista панель управления скручивается с помощью "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\"
Для Vistastrong > см. 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);
}