How to change default sound playback device programmatically?

后端 未结 3 1815
别那么骄傲
别那么骄傲 2020-12-01 05:14

How to change the default default audio device for playback and recording in vista programmatically ?

Is there any registry setting for it like sound manager in wi

3条回答
  •  鱼传尺愫
    2020-12-01 05:36

    I really don't know if anyone still needs this, but here is my solution. Actually, it's for the capture device, but it can be changed easily to the render device.

    It sets 3 registry values in the device's key to the current time. Magic, but that's how it works. Note: only tested on 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);
    }
    

提交回复
热议问题