CD-ROMが交換されたことを検出する
CD-ROMが交換されたことを検知する方法を捜し回った結果、やっとC++Builderでの例を見つけることができましたので、Delphiでの方法に書き換えて見ました。なお、C++Builderではdbt.h内でDBT_???メッセージが定義されているため、このヘッダーファイルをインクルードすればよいのですが、Delphiには定義ファイルがないようです。従ってdbt.h内を参照して、各メッセージを定数で分岐させています。本来はconstで定義すればよいのでしょうが、必要な種類が少ないのでそこまで行なっていません。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Private 宣言 }
// WM_DEVICECHANGEメッセージに対する
procedure WmDevChange(var Mess: TMessage); message WM_DEVICECHANGE;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// C++Builderの場合 dbt.h 内に以下のメッセージが定義されているが
// Delphi3では定義されていない
procedure TForm1.WmDevChange(var Mess: TMessage);
var
buf: string;
begin
case Mess.WParam of
$0018://DBT_CONFIGCHANGED:
buf := 'デバイス構成が変化しました.';
$8000://DBT_DEVICEARRIVAL:
buf := 'デバイスが挿入され使用可能になりました.';
$8001://DBT_DEVICEQUERYREMOVE:
buf := 'デバイスの削除を要求されました.';
$8002://DBT_DEVICEQUERYREMOVEFAILED:
buf := 'デバイス削除要求がキャンセルされました.';
$8004://DBT_DEVICEREMOVECOMPLETE:
buf := 'デバイスが削除されました.';
$8003://DBT_DEVICEREMOVEPENDING:
buf := 'デバイスが削除されようとしています.拒否することはできません.';
$8005://DBT_DEVICETYPESPECIFIC:
buf := 'デバイス固有のイベント.';
$0007://DBT_DEVNODES_CHANGED:
buf := 'デバイスノードが変化しました.';
end;
MessageDlg(buf, mtInformation, [mbOK], 0);
end;
end.
フォームのprivate宣言の中でprocedure WmDevChange(var Mess: TMessage); message WM_DEVICECHANGE;を定義して、procedure フォーム名.WmDevChange(var Mess: TMessage);の実態を上記のように記述して下さい。
実際にCD-ROMが交換されて発生するイベントはDBT_DEVICEARRIVALです。この部分に、実際に行ないたい処理を記述すればよいでしょう。
戻る