关于光驱托盘状态的讨论,大家快来了,都有分啦。(100分)

  • 主题发起人 主题发起人 feng_me
  • 开始时间 开始时间
F

feng_me

Unregistered / Unconfirmed
GUEST, unregistred user!
这几天想写个光驱小程序,但苦于光驱状态的判别。在论坛里相关的帖子我也看了不少,
但似乎没有我想要的。虽然写这个程序是心血来潮,但现在我还是想总结一下,算是给
后来的朋友们一点点资料。好,下面是我找到的资料:
procedure TForm1.Button2Click(Sender: TObject);
begin

with MediaPlayer1do

if (MediaPlayer1.Mode = mpOpen) then

mciSendCommand(MediaPlayer1.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0)
else

mciSendCommand(MediaPlayer1.DeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0);
end;

这个小程序可以打开或关闭一次光驱(也只有一次),再来就不管用了。
朋友们请积极留贴,只要有关系就可以了。都有分啦:)
 
给你一个控制光驱的例子
function IsDriverCD(Drive: Char): Longbool;
var
DrivePath: string;
begin

DrivePath := Drive+':/';
Result:= Longbool(GetDrivetype(Pchar(DrivePath)) and Drive_CDROM);
end;


function EjectCD(Drive:char):bool;
var
mp:TMediaplayer;
begin

result := False;
application.ProcessMessages;
if not IsDriverCD(Drive) then
Exit;
mp := TMediaplayer.Create(nil);
mp.Visible := False;
mp.Parent := application.MainForm;
mp.Shareable := true;
mp.DeviceType := dtCDAudio;
mp.FileName := Drive+':/';
mp.Open;
application.ProcessMessages;
mciSendcommand(mp.deviceId,MCI_SET,MCI_SET_DOOR_OPEN,0);//mp.Eject;
Application.ProcessMessages;
mp.Close;
Application.ProcessMessages;
mp.Free;
Result := True;
end;


function CloseCD(Drive:char):boolean;
var
mp:TMediaplayer;
begin

// result := False;
Application.ProcessMessages;
mp := TMediaplayer.Create(nil);
mp.Visible := False;
mp.Parent := application.MainForm;
mp.Shareable := True;
mp.DeviceType := dtCDAudio;
mp.FileName := Drive+':/';
mp.Open;
Application.ProcessMessages;
mciSendCommand(mp.DeviceId,MCI_SET,MCI_SET_DOOR_CLOSED,0);
Application.ProcessMessages;
mp.Close;
Application.ProcessMessages;
mp.Free;
Result := True;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin

if not EjectCD('G') then

showmessage('Not A CD Audio');
end;


procedure TForm1.Button2Click(Sender: TObject);
begin

CloseCD('G');
end;


procedure TForm1.Button3Click(Sender: TObject);
var
mp: TMediaPlayer;
begin

mp := TMediaplayer.Create(nil);
mp.Visible := false;
mp.Parent := Application.MainForm;
mp.DeviceType :=dtCDAudio;
mp.Open;
mp.Eject;
application.ProcessMessages;
mp.Close;
mp.Free;
end;

 
估计问题出在if (MediaPlayer1.Mode = mpOpen) then

这句上面。
自己设置一个布尔型变量表示当前光驱是否是开着的,然后程序不用做任何改变,应该
没有问题的。
 
我认为Windows系统根本不能判断光驱的状态,我下载过许多程序,都是有点击系统栏图标
就可控制光驱弹出、弹入的那种。但依我看都是设置一个标志(布尔型变量),点击一次设
置为True,第二次为False。不信你可以下载一个试一下,运行后你点击一下,光驱弹出,
这时你按光驱上的按钮使光驱入仓,再点击图标,没有反应。再点击一次,光驱又弹出。
我编光驱控制程序时就遇到这样的问题,最后就是这样解决的。
也许我的想法不对,那位大侠还有更好的想法,请来这里讨论。
 
to lww:
你说的对,我知道啊。可是如何判断呢?这的确是个关键问题。
to 楼上的兄弟:
你说的那样的效果不是我想要的。根据当前的托盘状态来定。WINDOWS没有这种功能?不会吧~~~
绝望了。
提前问题。

cAkk兄:您写的阅览器老是死,怎么回事啊?
 
我认为有一个好方法。我用Visual Studio里的那个Spy++工具探索过这个问题,发现在光驱
打开或者闭合的时候,系统就会向各个进程广播一条WM_DEVICECHANGE消息,若是闭合,则
wParam是DBT_DEVICEARRIVAL,打开就是DBT_DEVICEREMOVECOMPLETE了,我们要做的就是
捕获这条消息,然后……呵呵,就随你怎么办了。大家可以自己试一下,问题是我在Win2000
里居然有时捕获到,有时什么也没有,真是奇怪,98里应该没有这样的事,不知哪能个高手
愿意帮忙。
 
这个问题在几年以前就讨论过,BigBing 说得很对,至于判断是否存在光盘的方法,当时就
存在争议,共同的观点是去读光盘的目录或者卷标号

至于是否使用消息查询CDROM状态,Microsoft肯定有他们的方法,不过应该是没有公布出来。
 
检查cd门开着还是关着,确实没什么直接的方法,我觉得最好的就是检查volume了
至于开启还有关闭,这个方法也可以
mciSendString('Set cdaudiodo
or open wait', nil, 0, 0);
mciSendString('Set cdaudiodo
or closed wait', nil, 0, 0);
 
我赞同楼上的朋友,我的另一个程序是这样实现的,但有一个问题是:怎样判断光盘舱内有没有
光碟??[:(]
 
我也发现了,用传入MCI_STATUS参数进行查询的方法根本不管用,可以把上面的方法综合
起来,先用Bool类型记录光驱状态,然后用读盘的方法判断光驱是否准备好,这里会有特殊
的情况就是盘虽然进去了,但是读不出来,这在程序中应该已经算是光驱开启将其关闭,
所以需要再按一下了,这种方法不知道用户能不能接受?
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=634562

灌水->订阅Mail

不好意思
 
后退
顶部