はじめに
usbipd-winを使ってWSL2にカメラを接続する方法は以下の手順です。- 管理者権限でコマンドプロンプトを立ち上げる
- 「usbipd list」コマンドでカメラのBUSIDを調べる
- 「usbipd bind -b (busid)」「usbipd attach -b (busid) --wsl」で接続する
これらの手順をGUIを使って簡略化しました。
使用した環境は以下の通りです。
Visual Studio Community 2022 C# Windowsフォームアプリケーション(.NET Framework)
完成図
カメラを選択してEnterキーを押す又はマウスをダブルクリックします。
not sharedならattachします。
attachedならdetachします。
注意点
あらかじめWSL2を立ち上げておかないと何も起きません。C#コード
フォームにリストボックスだけを配置しました。using System; using System.Diagnostics; using System.Text; using System.Threading; using System.Windows.Forms; namespace WebCam_mount { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e) { attach_detach(); Close(); } private void listBox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { attach_detach(); Close(); } } private void attach_detach() { if (listBox1.SelectedIndex != -1) { string select_string = listBox1.SelectedItem.ToString(); string busid = select_string.Split(' ')[0]; if (select_string.Contains("Not shared")) { string command = $"usbipd bind -b {busid} && usbipd attach -b {busid} --wsl"; var proc2 = new Process(); proc2.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec"); proc2.StartInfo.Verb = "RunAs"; proc2.StartInfo.UseShellExecute = true; proc2.StartInfo.Arguments = @"/c" + command; proc2.Start(); } else { string command = $"usbipd detach -b {busid}"; var proc2 = new Process(); proc2.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec"); proc2.StartInfo.UseShellExecute = true; proc2.StartInfo.Arguments = @"/c" + command; proc2.Start(); Thread.Sleep(200); command = $"usbipd unbind -b {busid}"; var proc3 = new Process(); proc3.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec"); proc3.StartInfo.Verb = "RunAs"; proc3.StartInfo.UseShellExecute = true; proc3.StartInfo.Arguments = @"/c" + command; proc3.Start(); } } } private void Form1_Load(object sender, EventArgs e) { var proc = new Process(); proc.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec"); proc.StartInfo.CreateNoWindow = true; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.StandardOutputEncoding = Encoding.UTF8; proc.StartInfo.Arguments = @"/c usbipd list"; proc.Start(); string txtResult = proc.StandardOutput.ReadToEnd(); proc.WaitForExit(); string[] _kugiri = { "\r\n" }; string[] arr = txtResult.Split(_kugiri, StringSplitOptions.RemoveEmptyEntries); for (int i = 1; i < arr.Length; i++) { listBox1.Items.Add(arr[i]); } } } }