Windows 再生デバイス/サウンドの切り替え[PowerShell]
簡単に切り替えを、出来るようにする。
複数あるサウンド再生デバイスを、ラジオボタンで選べる。
めんどくさいのでAIで作ってみた。
すでに自分で作成したのがあったが、IDが変わったりすることで、
うまくいかないこともあり、その度に修正するのも億劫なので
AIで作成してみたら、簡単にできました。
(ほぼ手を入れていないので、OKボタンの位置が...)
下記スクリプト(kirikae.ps1)を保存。それをショートカットで登録してください。
"C:\path\script\kirikae.ps1"は実際のスクリプトのパスに置き換え
powershell.exe -WindowStyle Hidden -ExecutionPolicy RemoteSigned -File "C:\path\script\kirikae.ps1"
# AudioDeviceCmdletsモジュールのインポートまたはインストール
if (!(Get-Module -ListAvailable -Name AudioDeviceCmdlets)) {
Install-Module -Name AudioDeviceCmdlets -Scope CurrentUser
}
Import-Module AudioDeviceCmdlets
# 再生デバイスのリストを取得する
$playbackDevices = Get-AudioDevice -List | Where-Object { $_.Type -eq "Playback" }
# 再生デバイス情報の配列を作成する
$deviceList = @()
foreach ($device in $playbackDevices) {
$deviceInfo = [PSCustomObject]@{
ID = $device.ID
Name = $device.Name
Default = $device.Default
}
$deviceList += $deviceInfo
}
Add-Type -AssemblyName System.Windows.Forms
# フォーム作成
$form = New-Object System.Windows.Forms.Form
$form.Text = "サウンド切り替え"
$form.StartPosition = "CenterScreen"
$font = New-Object System.Drawing.Font("Arial", 10)
# 動的にラジオボタン作成
$top = 20
foreach ($radio in $deviceList) {
$radioButton = New-Object System.Windows.Forms.RadioButton
$radioButton.Text = $radio.Name
$radioButton.Name = $radio.ID.ToString()
$radioButton.Font = $font
$radioButton.Checked = $radio.Default
$radioButton.AutoSize = $true
$radioButton.Top = $top
$radioButton.Left = 20
$form.Controls.Add($radioButton)
$top += 30
}
# OK ボタン
$okButton = New-Object System.Windows.Forms.Button
$okButton.Text = "OK"
$okButton.Top = $top + 10
$okButton.Left = 20
$okButton.Add_Click({
foreach ($control in $form.Controls) {
if ($control.Checked) {
Set-AudioDevice -ID $control.Name
# [System.Windows.Forms.MessageBox]::Show("Selected Option: $($control.Name)")
}
}
$form.Close()
})
$form.Controls.Add($okButton)
# キャンセルボタン
$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Text = "Cancel"
$cancelButton.Top = $top + 10
$cancelButton.Left = 100
$cancelButton.Add_Click({
$form.Close()
})
$form.Controls.Add($cancelButton)
# フォームのサイズを動的に設定
$form.Height = $top + 80
$form.Width = 300
# フォーム表示
$form.ShowDialog()
AIでつくってみた
Microsoft Copilotに、聞いてみたら簡単にできました。
作成例としての覚書
- powershellでサウンドの再生デバイスのリストの取得
- powershellでフォーム ラジオボタン
上記の内容を個別に聞いて、スクリプトを作成。
まとめて聞くとうまくいかないので..
2つを合わせて、数行の追加・修正で対応
#スクリプトのOKを押したらのところに~ サウンド切り替えのコードを追加
#配列の名前を修正、要らない配列は削除など
的確に仕様を入れると、ほぼ無修正で済みます。
powershellでサウンドの再生デバイスのリストの取得
AudioDeviceCmdlets モジュールを使用する
playbackデバイスのみ
配列にID,Name,Default(デバイスのDefault)を入れる
powershellでフォーム
複数のラジオボタンを表示
配列にID,Name,Defaultが入っている
配列の数でラジオボタン表示
--
ラジオボタンのテキストにName
ラジオボタンのテキストの長さは可変
ラジオボタンのNameにID
ラジオボタンのチェックにDefault
フォントの設定も入れる
--
フォーム下部にOKとキャンセルボタン
ラジオボタンの数によりフォームのサイズも変わる
OKを押したら、選択されているラジオボタンを表示
※同じようにAIに聞いても、期待できる結果と違うこともありますので注意。
例えば ラジオボタンをグループ化したりするコードを返したり
サウンドのリストをWindows APIを使用するのだったり
適確に指示すれば、回避もできますが、どれが正解かは自分で判断しないといけない。
こちらが何回か質問していることにより、学習して回避するコードにもなってたりもしています。
例えば、フォーム・コントロールの作成時に入れる数値は、一旦変数に入れて計算するとか
四則演算を括弧の中で行うと実行時にエラー表示になるので(form.xxx($a +50, $i *3 +50))等
(単純に、フォーム・コントロールの作成時に入れる数値は括弧の中で計算しないでとか)
それ以降、変数で計算してから代入するコードに変わりましたが...
実際は、この記事を書く前に、作成したスクリプトと、記事を書くので再作成しスクリプトは、かなり違っています。
後から作成したスクリプトの方が、一旦変数で計算してから代入するコード自体が少なくなっています。
プロパティ(xxx,yyy)みたいに複数に入れるのが、プロパティ.A=xxx プロパティ.B=yyy 単独で入れるコードに変更されています。
良くはなっていますが、結果が毎回違うと記事とかにすると あれれ? とかなります。