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です。この部分に、実際に行ないたい処理を記述すればよいでしょう。

戻る