2010-02-01 185 views
12

如何更改默认的默认音频设备以编程方式在vista中播放和录制?如何以编程方式更改默认声音播放设备?

是否有任何注册表设置它像声音管理器在Windows XP中?

哪个API可以实现它?

+0

您是指默认的声音输出?即使是非MCI播放? – 2010-02-01 15:32:17

回答

11

没有公共API允许您更改默认音频设备,即被认为是在用户控制下的功能。 Windows中一直如此。尽管如此,如果您在网上搜索,有很多人已经对Windows Vista中使用的API进行了反向设计,但我不打算指向他们(相反设计的API是内部不受支持的API,可能会在没有得到Microsoft通知的情况下更改)。您可以自行使用这些解决方案。

+1

http://sdae.codeplex.com/ - 我用这个,它工作。 – 2014-01-24 14:24:25

+0

我将上述注释中的链接代码转换为C#并添加了一些内容,您也可以在此处找到它:https://github.com/zivsha/SoundControl – ZivS 2016-10-19 06:58:44

13

System Tray Audio Device Switcher使用"Software\Microsoft\Multimedia\Sound Mapper", "Playback"来设置通过枚举设备获得的声音设备的索引。 mciSendCommand从“WINMM.DLL”也被

在这个source code,你会发现用来实现该注册表项。

如果这不起作用,您可以试一试Process Monitor,并在更改默认设备时监视Windows的所有注册表活动。在我的Vista安装控制面板"HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\"

旋转因子为Vista的看到 http://www.vistaaudiochanger.com/

5

我真的不知道,如果有人仍然需要这一点,但这里是我的解决方案。实际上,它是用于捕捉设备的,但它可以很容易地更改为渲染设备。

它将设备密钥中的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); 
} 
+0

太棒了!即使在Windows 10中工作 – 2016-07-06 00:03:31

+0

实际上这并不起作用,至少在Windows 7/64中不起作用。声音/录音对话框确实显示了默认录音设备的变化(如果至少重新载入),但(重新打开)WaveIn功能仍然从旧设备获取数据。所以它看起来是一个整体变化,内部的东西没有更新。猜猜它需要更多的魔法。 – 2016-08-16 12:34:24