13

プログラムでビスタで再生および録音するためのデフォルトのデフォルトオーディオデバイスを変更するにはどうすればよいですか?

Windows XPのサウンドマネージャのようなレジストリ設定はありますか?

どのAPIを使用しますか?

4

3 に答える 3

13

システムトレイオーディオデバイススイッチャーは"Software\Microsoft\Multimedia\Sound Mapper", "Playback"、デバイスを列挙することによって取得されたサウンドデバイスのインデックスを設定するために使用します。 「 winmm.dll」のmciSendCommandも使用されます

このソースコードには、それを実現するために使用されるレジストリキーがあります。

これが機能しない場合は、デフォルトのデバイスを変更するときに、ProcessMonitorを試してWindowsのすべてのレジストリアクティビティを監視することができます。私のVistaのインストールでは、コントロールパネルは"HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\"

Vistaについては、 http: //www.vistaaudiochanger.com/を参照して ください。

于 2010-02-07T13:27:27.437 に答える
8

デフォルトのオーディオデバイスを変更できるパブリックAPIはありません。これは、ユーザーの制御下にあると見なされる機能です。これは、Windowsでは常に当てはまります。

そうは言っても、Webを検索すると、これを行うためにWindows Vistaで使用されるAPIをリバースエンジニアリングした人がたくさんいますが、それらを指摘するつもりはありません(リバースエンジニアリングされたAPIは内部にあります)サポートされていないAPIであり、Microsoftからの通知なしに変更される可能性があります)。あなたはあなた自身の危険でこれらの解決策を使います。

于 2010-02-03T18:56:30.463 に答える
6

誰かがまだこれを必要としているかどうかは本当にわかりませんが、ここに私の解決策があります。実はキャプチャーデバイス用ですが、レンダリングデバイスに簡単に変更できます。

デバイスのキーに3つのレジストリ値を現在の時刻に設定します。魔法ですが、それがどのように機能するかです。注:Win7x64でのみテストされています

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);
}
于 2014-08-22T22:06:39.767 に答える