2010-02-01 5 views

Répondre

11

Aucune API publique ne vous permet de modifier le périphérique audio par défaut, c'est-à-dire la fonctionnalité considérée comme étant sous le contrôle des utilisateurs. Cela a toujours été le cas sous Windows. Cela dit, si vous effectuez une recherche sur le Web, il y a un certain nombre de personnes qui ont procédé au reverse engineering des API utilisées dans Windows Vista pour ce faire, mais je ne vais pas vous les signaler (l'inverse les API conçues sont des API internes non prises en charge et peuvent être modifiées sans préavis par Microsoft). Vous utilisez ces solutions à vos risques et périls.

+1

http://sdae.codeplex.com/ - J'ai utilisé ceci et cela a fonctionné. –

+0

J'ai converti le code du lien dans le commentaire ci-dessus en C# et ajouté quelques trucs, vous pouvez le trouver ici aussi: https://github.com/zivsha/SoundControl – ZivS

13

System Tray Audio Device Switcher utilise "Software\Microsoft\Multimedia\Sound Mapper", "Playback" pour définir l'indice du périphérique sonore qui a été obtenu par énumération des périphériques. mciSendCommand de « WINMM.DLL » est également utilisé

Dans ce source code vous trouverez les clés de Registre utilisées pour y parvenir.

Si cela ne fonctionne pas, vous pouvez essayer Process Monitor et de surveiller toutes les activités de registre de Windows lorsque vous changez le périphérique par défaut. Sur mon installation Vista le panneau de commande twiddles avec "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\"

Pour Vista voir http://www.vistaaudiochanger.com/

5

Je ne sais vraiment pas si quelqu'un a besoin encore, mais voici ma solution. En fait, c'est pour le périphérique de capture, mais il peut facilement être changé en périphérique de rendu.

Il définit 3 valeurs de registre dans la clé de l'appareil à l'heure actuelle. Magique, mais c'est comme ça que ça fonctionne. Remarque: uniquement testé sur 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

Great! Travailler même sous Windows 10 –

+0

En fait, cela ne fonctionne pas, du moins pas sous Windows 7/64. La boîte de dialogue Sound/Recording affiche la modification du périphérique d'enregistrement par défaut (si vous le rechargez au moins), mais les fonctions WaveIn (rouvertes) obtiennent toujours leurs données de l'ancien périphérique. Il semble donc être un changement cosmétique, en interne les choses ne sont pas mises à jour. Je suppose qu'il faut plus de magie. –

Questions connexes