以前C#でCDトレイを開閉する方法について質問し
mciSendString("open " + drive + " type cdaudio alias orator", null, 0, IntPtr.Zero);
int canEject = mciSendString("capability orator can eject", null, 0, IntPtr.Zero); ←①
Console.WriteLine("{0}はイジェクト{1}です。", drive, (canEject == 0) ? "可能" : "不可"); ←②
Console.WriteLine("{0}ドライブを開きます。", drive);
mciSendString("set orator door open", null, 0, IntPtr.Zero);
Console.WriteLine("{0}ドライブを閉じます。", drive);
mciSendString("set orator door closed", null, 0, IntPtr.Zero);
mciSendString("close orator", null, 0, IntPtr.Zero);
の方法を教えていただきました。
このコードの、
「事前にCDトレイをあけることが可能であるかを判断するコード」(①と②)をみて、
同じように「事前にCDトレイを閉じることが可能か判断するコード」はないだろうかと考えたのですが
調べても存在するのかどうかすらわかりません(調べ方がそもそも間違っているのかもしれません)。
現状、お手上げ状態です。どうかお知恵を貸していただきたくよろしくお願いします。
このEJECTというのは、吐き出すという意味のようですが、この場合は閉じることも可能という事になるのではないでしょうか?
なお調べてみましたが、閉じることが可能か?というような、提示された以外のコマンドでは無いようです。
下記URLの最後の方にコマンド一覧があります。
あけることが可能かどうかということは、
あいてたら 不可能
しまってたら 可能 ということなので
閉じることが 可能 ということは
あいてたら 可能
しまってたら 不可能 と判断されるわけなので
①の結果を 逆に捕らえればいいだけなのでは?
それとも もっと別に知りたいことが あるのかな?
このEJECTというのは、吐き出すという意味のようですが、この場合は閉じることも可能という事になるのではないでしょうか?
なお調べてみましたが、閉じることが可能か?というような、提示された以外のコマンドでは無いようです。
下記URLの最後の方にコマンド一覧があります。
コマンド一覧を紹介いただきありがとうございます。大変参考になります。
「CDトレイを閉じるコマンド」をプログラムから指示できない(押しボタン式で閉じるタイプ)PCの
CDトレイを空けたままで①のコマンドを実行してみたところ、戻り値が0(==できる)になることを確認しました。
なので、、戻り値は、
プログラムでの指示が可能であるかどうか?
を返しているわけではない気がします。
(たんに開閉できるかどうかを返している・・・?)
mciSendStringは上位アプリケーション用のAPIですが、そのAPIが利用しているよりももっと下位のデバイスドライバレベルで「閉じることができるかどうか」についての情報を提供しているようには見えませんので、少なくともWindowsアプリケーションで(マネージドかネイティブかに関わらず)、汎用の方法で「閉じることができるかどうか」をプログラムから知ることは不可能のように思います。
General Storage I/O Control Codes(CD-ROMを含むストレージデバイスドライバがサポートする機能)
トレイを開ける(IOCTL_STORAGE_EJECT_MEDIA)、トレイを閉じる(IOCTL_STORAGE_LOAD_MEDIA)はありますが、「閉じられるかどうか」を確認する機能はありません。
特定のドライブ用のドライバが専用の「閉じられるかどうか」を確認する機能を、ドライバレベルで提供している可能性はありますが、汎用性はありません。
なお「閉じる」コマンドを実行した後、実際に「閉じた」か、「閉じるのに失敗した」かはエラーコードで取得することができます(mciSendStringの場合は、戻り値で取れると思います)。失敗した場合は「手動で閉じてください」等のメッセージを表示することは可能です。
参考:ネイティブアプリケーション(アンマネージド)からデバイスドライバを直接制御して開閉する方法
Windows NT または Windows 2000 または Windows XP でリムーバブル メディアを Ejecting する方法
回答ありがとうございます。
「CDトレイが開閉可能か事前に調べることができるか?」は
デバイスドライバがその情報を返すかによるところですね。
直接デバイスドライバを制御することで
対応できるケースもありそうですが・・・、メーカ独自の仕様が
多いのでしたら汎用性がなくなり面白みも減ってしまいます。
大変参考になりました。
コマンド一覧を紹介いただきありがとうございます。大変参考になります。
「CDトレイを閉じるコマンド」をプログラムから指示できない(押しボタン式で閉じるタイプ)PCの
CDトレイを空けたままで①のコマンドを実行してみたところ、戻り値が0(==できる)になることを確認しました。
なので、、戻り値は、
プログラムでの指示が可能であるかどうか?
を返しているわけではない気がします。
(たんに開閉できるかどうかを返している・・・?)