如何检测光驱弹开和关闭事件?(用DELPHI编程)(50分)

试试这个控件:<a href="http://vcl.vclxx.com/DELPHI/D32FREE/CDEVENTS.ZIP">CDEVENTS.ZIP</a>
 
TForm1 = class(TForm)
label1:Tlabel;
.......
procedure WMDeviceChange(var Msg : TWMDeviceChange);
procedure HasCdRom;
procedure HasNotCdRom;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FWindowHandle: HWND;
procedure myWndProc(var Msg: TMessage);
{ Private declarations }
public
{ Public declarations }
end;

procedure TForm1.myWndProc(var Msg: TMessage);
begin
if (Msg.Msg = WM_DEVICECHANGE) then
//如果是设备改变消息的话
try
WMDeviceChange(TWMDeviceChange(Msg));

except
Application.HandleException(Self);
end
else

Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
//如果不是设备改变消息,则交给FORM缺省的消息处理系统完成
end;
procedure TForm1.WMDeviceChange(var Msg : TWMDeviceChange);
var
lpdb : PDEV_BROADCAST_HDR;
//
lpdbv : PDEV_BROADCAST_VOLUME;
begin
(* 接受 a wm_devicechange message *)
lpdb := PDEV_BROADCAST_HDR(Msg.dwData);
(* 查看 wm_devicechange 消息中EVENT 是何事件 *)
case Msg.Event of
DBT_DEVICEARRIVAL : begin
if lpdb^.dbch_devicetype = DBT_DEVTYP_VOLUME then
begin
lpdbv := PDEV_BROADCAST_VOLUME(Msg.dwData);
if (lpdbv^.dbcv_flags and DBTF_MEDIA) = 1 then
begin
//CheckCdRomVolume;我的程序里要检查光盘卷标
//HasCdRom;
CDRom被加载
showmessage('有光盘加入进来');
end;
end;
end;
DBT_DEVICEREMOVECOMPLETE : begin
if lpdb^.dbch_devicetype = DBT_DEVTYP_VOLUME then
begin
lpdbv := PDEV_BROADCAST_VOLUME(Msg.dwData);
if (lpdbv^.dbcv_flags and DBTF_MEDIA) = 1 then
//HasNotCdRom;
CD Rom被取出
showmessage('CD被取出');
end;
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FWindowHandle:=AllocateHWnd(mywndproc);
//截取WINDOWS交给每个窗口的消息,交给MYWNDPROC处理,用来判断CD驱动器改变
//在WIN95里,每个设备的改变,系统都要发一个消息给所有当前窗口
//所以这里要用自定义的消息循环代替DELPHI 程序默认的窗口消息循环
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DeallocateHWnd(FWindowHandle);
//释放句柄
end;
 
好个坏人,可真够坏的。放着这么好的控件不用,硬是从其中Copy出一段程序来
抢分!? :-(
 
我同意,希望大家还是直接指出解决办法,
不要以贴代码为乐趣! *_^
 
接受答案了.
 
谢谢各位!谢谢!!!
 
LittleGrass,我看过那控件的, 不过我一个朋友问我为什么要这样做
上面 的代码是我从自己做的一个多媒体数据库程序里摘出来的,非抄袭别人
之做 ,非是和你抢分,我上这里很麻烦的,只有等到教育网的先生女士们吃饭
的这个时候来瞧瞧,答题本身是对自己的以往知识的一个复习。
To: dwwang, 我始终认为代码段+ 详细的注释要比你给人家一个控件要好
我有6000多控件,将近1G了,给人一个简单的原理答案人家听不懂
给人一个控件人家不会明白控件的工作原理
 
hi 坏人,我,...,我可没说你“抄袭别人之做”,别太认真了!:)
 
接受答案了!!!
 
顶部