VBでCDトレイを開く
日頃のメインマシンはミニノートなのですが、マウスとキーボードとモニタを外付けにしています。だからミニノートのモニタは閉じたまま。
それで別に不具合はない…かというと、使用しているマシンにはCD/DVDドライブを開くボタンが本体前面に付いているのに、モニタが閉じていると機能しなくなる。持ちはこびの時に何かの拍子で開くのを防ぐためなのでしょうけど、そうなるとちょっと面倒。
ドライブに付いている[開くボタン]は小さすぎて押しにくく、ファイラから開くこともできるけど最近はファイラ以外のものにフォーカスがあるときに開閉する必要があり、エクスプローラなんか使う機会もない。
たいていのソフトはランチャから起動させているので、ドライブを開きたい時もフォーカスがランチャにあることが多い。だったらランチャにトレイを開くツールを登録すればいい、というのが今回のツール作成動機。
開くこと自体は結構簡単。
Private Declare Ansi Function MciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpszCommand As String, ByRef lpszReturnString As String, ByVal cchReturn As Integer, ByVal hwndCallback As Integer) As IntegerPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MciSendString("Set CDAudio Door Open Wait", Nothing, 0, 0)
End Sub
どうやら一番最初に見つけたCD/DVDドライブのトレイを開くらしいので、仮想ドライブのドライブレターが物理ドライブより前にあると(仮想=D、物理=Eとか)仮想ドライブがオープン状態になるらしい。Virtual Clone DRIVEだと、マウントしているように表示されるけど実は取り出されている扱いになる。
ドライブを指定する場合は
と、CDAudioに続けて![ドライブレター]で指定可能。
MciSendString("Set CDAudio Door Open Wait", Nothing, 0, 0)
↓
MciSendString("Set CDAudio!E Door Open Wait", Nothing, 0, 0)
他にも
とやってもできるらしい。
MciSendString("Open E Type CDAudio Alias CDAudio")
MciSendString("Set CDAudio Door Open Wait", Nothing, 0, 0)
で、マシンによってCD/DVDドライブのドライブレターが違うことを考えると、外部ファイルにドライブレターを書いておいてそれを読み込むのが現実的かな?
Private Declare Ansi Function MciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpszCommand As String, ByRef lpszReturnString As String, ByVal cchReturn As Integer, ByVal hwndCallback As Integer) As IntegerPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'外部ファイル(ただ「E」って書いてあるだけ。複数ドライブを開く場合はドライブレター\nドライブレター\n…と書く)を指定。
dim ini_file as string = My.Application.Info.DirectoryPath & "\Drive_Letter.ini"'外部ファイルがあったら
If My.Computer.FileSystem.FileExists(ini_file) ThenDim readText() As String = File.ReadAllLines(inifile)
Dim s As String
Dim cd_drive as string = ""For Each s In readText
'コマンドと外部ファイルで指定されたドライブレターとを合成して開く。
'ホントはここで「使用可能な文字か?ドライブは存在するか?使用中じゃないか?」とかチェックすべき
cd_drive = "set CDAudio!" & s & " Door Open Wait"
MciSendString(cd_drive, Nothing, 0, 0)
NextFileClose(1)
Else
'外部ファイルがなかったらメッセージを表示
MsgBox("File not found.")
End IfEnd
End Sub
これでOK。CD/DVDドライブがD〜Zまであってもすべて一斉に開いて遊べる。
閉じる場合は
らしい。D〜Zを開いたり閉じたりして遊ぶのも…やめたほうがいいですね。
mciSendString("Set CDAudio Door Closed", Nothing, 0, 0)