VBScriptでサウンドデバイスを切り替える

キーボードを、サウンドが再生できるものに変えたのですが、
基本的にシステムの音はそこから再生すれば良いですが、
参考曲などの音楽は本スピーカーの方から流したかったりします。
しかしコントロールパネルのサウンドとオーディオデバイスから、
一々デバイスを切り替えるのは面倒ですよね。
下記に掲載するコードでデバイスを簡単に切り替えてくれます。


サウンドとオーディオデバイス


僕の環境ではSoundMaxとUSBオーディオMOTUオーディオのデバイスが表示されています。
このうちのSoundMaxとUSBオーディオを切り替えます。
因みにSoundMaxはアナログ端子でオーディオインターフェイスへ入力されています。
MOTUオーディオを選択しないのは、DAW使用時にシステム音もMOTUオーディオへ変えると、
48kHzなどのサンプルレートのプロジェクトの時、
プロジェクトは48kHzの設定なのにオーディオインターフェイスが強制的に44.1kHzになって、
なにかと面倒くさいからです。


スクリプトに関してですが、本当は内部からデバイスの切り替えが出来れば良かったのですが、
妥協してセンドキーにしました(笑)
ただ、なるべくWin32APIのウィンドウ関連の関数を使って少しでも誤動作が起きないようにはしてます。
Win32APIのwaveOutGetNumDevsとかwaveOutGetDevCapsあたりを調べたら内部から操作も出来そうな気もしますが、
思ったより複雑な気がします。そもそもVBSでは出来ないかもしれないし(笑)


SoundMax用VBSとUSBオーディオ用VBSを作っても良いと思いますが、
トグルにして同じファイルから切り替える形にしたかったので、
レジストリを使用して値を保存することにしました。
なので、使用される際はまずレジストリにキーを登録しないと使えません。
下記をコピペしてテキスト保存し、拡張子をregへ変更します。


☆Setup.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\VBScript\Sound Device Switch]
"SwitchFlag"="0"


あとは、IF文のところの変数IniStrに、切り替えたいデバイスの頭文字を入れます。
僕の場合はSoundMaxとUSBオーディオなので、「s」と「u」ですね。
それと、前回ご紹介したSFC miniが必要になります。


☆Sound Device Switch.vbs

Const REG_MYKEY = "HKCU\Software\VBScript\Sound Device Switch\SwitchFlag"
Const WM_COMMAND = &H111
Dim SwitchFlag, hWnd
Dim WshShell
Dim IniStr
Dim FindWindow, SendMessage, SetForegroundWindow

Set FindWindow = CreateObject("SfcMini.DynaCall")
FindWindow.Declare "user32","FindWindowA"
Set SetForegroundWindow = CreateObject("SfcMini.DynaCall")
SetForegroundWindow.Declare "user32","SetForegroundWindow"
Set SendMessage = CreateObject("SfcMini.DynaCall")
SendMessage.Declare "user32","SendMessageA"
Set WshShell = WScript.CreateObject("WScript.Shell")

With WshShell
    If .RegRead(REG_MYKEY) Then
        SwitchFlag = 0
        IniStr = "s"
    Else
        SwitchFlag = 1
        IniStr = "u"
    End If
    .Run "control MMsys.cpl ,2", 1, False

    Do Until hWnd <> 0
        hWnd = FindWindow("#32770", "サウンドとオーディオ デバイスのプロパティ")
    Loop
    Call SetForegroundWindow(hWnd)
    .SendKeys IniStr, True
    WScript.Sleep 500
    Call SendMessage(hWnd, WM_COMMAND, vbOk, 0)
    .RegWrite REG_MYKEY, SwitchFlag
End With



Windows自動処理のためのWSHプログラミングガイド

Windows自動処理のためのWSHプログラミングガイド