[|]光盘的弹入弹出会触发什么消息?

DEnzllWang 2003-10-10 09:38:26
是不是WM_DEVICECHANGE, 我用这个消息好像没有用.

...全文
56 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
nobill 2003-10-13
  • 打赏
  • 举报
回复
WM_DEVICECHANGE
bcb_alone 2003-10-11
  • 打赏
  • 举报
回复
#include "mmsystem.h";
//打开光驱
 mciSendString("Set cdAudio door open wait", NULL, 0, NULL);

//关闭光驱
mciSendString("Set cdAudio door closed wait", NULL, 0, NULL);
我弹入弹出光驱都是这样用的。
 

zihan 2003-10-11
  • 打赏
  • 举报
回复
{***************************************************************
*
* Unit Name: CXDiskFileUtils
* Purpose :
* Author : hubdog
* History : 0.01
*
****************************************************************}


unit CXDiskFileUtils;

interface

uses Classes, Sysutils;
//////////////CDRom Utils//////////////////////
//获得CDRom 序列号
function GetdiskserilNum(ADrive: string): string;
//获得CDRom卷标,返回''表示驱动器中没有光盘
function GetCDRomLabel(ADrive: string): string;
//获得第一个CDRom,返回''表示驱动器中没有光盘
function GetFirstCDROM: ShortString;
//获得系统驱动器列表
procedure Getdisks(Strings: TStringList);
//打开光驱
procedure OpenCDRom;
//关闭光驱
procedure CloseCDRom;
//切换光驱自动运行功能,设置在Windows重新启动后将生效
procedure SetCDRomAutoRun(AutoRun:Boolean);

implementation

uses Windows, MMSystem;
//////////////CDRom Utils////////////////////////////

function GetdiskserilNum(ADrive: string): string;
var
VolumeName : array[0..255] of char;
FileSystemType : array[0..255] of char;
SerialNum : DWORD;
MaxFilenameLength : DWORD;
Flags : DWORD;
begin
if (GetVolumeInformation(PChar(ADrive),
VolumeName,
256,
@SerialNum,
MaxFilenameLength,
Flags,
FileSystemType,
256)) then
Result := (IntToHex(SerialNum shr 16, 3) +
IntToHex((SerialNum shl 16) shr 16, 4));
end;

function GetCDRomLabel(ADrive: string): string;
var
VolumeName : array[0..255] of char;
FileSystemType : array[0..255] of char;
SerialNum : DWORD;
MaxFilenameLength : DWORD;
Flags : DWORD;
begin
//Result := '驱动器中没有CDRom';
if (GetVolumeInformation(PChar(ADrive),
VolumeName,
256,
@SerialNum,
MaxFilenameLength,
Flags,
FileSystemType,
256)) then
Result := VolumeName;
end;

function GetFirstCDROM: Shortstring;
var
AList : TStringList;
Counter : integer;
begin
//Result := '驱动器里无CDRom';
AList := TStringList.Create;
Getdisks(AList);
for Counter := 0 to AList.Count-1 do
if GetDriveType(PChar(Alist.Strings[Counter])) = DRIVE_CDROM then
Result := Alist.Strings[Counter]
end;

procedure Getdisks(Strings: TStringList);
const BufSize = 256;
var
Buffer : PChar;
P : PChar;
begin
GetMem(Buffer, BufSize);
try
Strings.BeginUpdate;
try
Strings.Clear;
if GetLogicalDriveStrings(BufSize, Buffer) <> 0 then begin
P := Buffer;
while P^ <> #0 do begin
Strings.Add(P);
Inc(P, StrLen(P) + 1);
end;
end;
finally
Strings.EndUpdate;
end;
finally
FreeMem(Buffer, BufSize);
end;
end;

procedure OpenCDRom;
begin
mciSendString('Set cdaudio door open wait', nil, 0, 0);//handle);
end;

procedure CloseCDRom;
begin
mciSendString('Set cdaudio door closed wait', nil, 0, 0);//handle);
end;

procedure SetCDRomAutoRun(AutoRun:Boolean);
const
DoAutoRun : array[Boolean] of Integer = (0,1);
var
Reg:TRegistry;
begin
try
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.KeyExists('System\CurrentControlSet\Services\Class\CDROM') then
if Reg.OpenKey('System\CurrentControlSet\Services\Class\CDROM',FALSE) then
Reg.WriteBinaryData('AutoRun',DoAutoRun[AAutoRun],1);
finally
Reg.Free;
end;
//设置在Windows重新启动后将生效
end;

end.

HUANG_JH 2003-10-10
  • 打赏
  • 举报
回复
补充:光盘的弹出也会触发
HUANG_JH 2003-10-10
  • 打赏
  • 举报
回复
WM_DEVICECHANGE 啊,我就是这样用的,不过是有点不好用,该消息应该是光盘的信息改变后,才会触发,也就是换了一张光盘后,就会触发,光盘的弹入弹出好像不触发
jiangchun_xn 2003-10-10
  • 打赏
  • 举报
回复
一般的,用户放了盘,点了确定,你访问盘的话,这是后光驱在动,因该是处于阻塞状态把,等到搞定了,你就可以继续了

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧