1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windows 再生デバイスの切り替え[PowerShell]AIでつくってみた

Posted at

Windows 再生デバイス/サウンドの切り替え[PowerShell]

簡単に切り替えを、出来るようにする。
複数あるサウンド再生デバイスを、ラジオボタンで選べる。

めんどくさいのでAIで作ってみた。
すでに自分で作成したのがあったが、IDが変わったりすることで、
うまくいかないこともあり、その度に修正するのも億劫なので
AIで作成してみたら、簡単にできました。
(ほぼ手を入れていないので、OKボタンの位置が...)

スクリーンショット 2024-11-17 015222.png

下記スクリプト(kirikae.ps1)を保存。それをショートカットで登録してください。
"C:\path\script\kirikae.ps1"は実際のスクリプトのパスに置き換え

powershell.exe -WindowStyle Hidden -ExecutionPolicy RemoteSigned -File "C:\path\script\kirikae.ps1"
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に、聞いてみたら簡単にできました。
作成例としての覚書

  1. powershellでサウンドの再生デバイスのリストの取得
  2. powershellでフォーム ラジオボタン

上記の内容を個別に聞いて、スクリプトを作成。
まとめて聞くとうまくいかないので..
2つを合わせて、数行の追加・修正で対応
#スクリプトのOKを押したらのところに~ サウンド切り替えのコードを追加
#配列の名前を修正、要らない配列は削除など
的確に仕様を入れると、ほぼ無修正で済みます。

1.powershellでサウンドの再生デバイスのリストの取得
powershellでサウンドの再生デバイスのリストの取得
AudioDeviceCmdlets モジュールを使用する
playbackデバイスのみ
配列にID,Name,Default(デバイスのDefault)を入れる
2. powershellでフォーム ラジオボタン
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 単独で入れるコードに変更されています。
良くはなっていますが、結果が毎回違うと記事とかにすると あれれ? とかなります。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?