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 Integer

Private 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だと、マウントしているように表示されるけど実は取り出されている扱いになる。

ドライブを指定する場合は


MciSendString("Set CDAudio Door Open Wait", Nothing, 0, 0)
 ↓
MciSendString("Set CDAudio!E Door Open Wait", Nothing, 0, 0)
と、CDAudioに続けて![ドライブレター]で指定可能。

他にも


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 Integer

Private 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) Then

    Dim 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)
    Next

    FileClose(1)
  Else
    '外部ファイルがなかったらメッセージを表示
    MsgBox("File not found.")
  End If

  End
End Sub

これでOK。CD/DVDドライブがD〜Zまであってもすべて一斉に開いて遊べる。

閉じる場合は


mciSendString("Set CDAudio Door Closed", Nothing, 0, 0)
らしい。D〜Zを開いたり閉じたりして遊ぶのも…やめたほうがいいですね。