先引用 Microsoft Scripting Runtime library,方法如下: 【工程】-->选择【引用】-->选择【Microsoft Scripting Runtime】(Scrrun.dll) Private Sub Command1_Click() On Error GoTo acd Command1.Enabled = False Dim FSO As FileSystemObject Dim aDrive As Drive Set FSO = New FileSystemObject For Each aDrive In FSO.Drives If aDrive.DriveType = CDRom And aDrive.IsReady = False Then MsgBox "光驱中没有光盘!" Exit For ElseIf aDrive.DriveType = CDRom Then MsgBox "光驱中有一张" & aDrive.VolumeName & "光盘" Exit For End If Next Set FSO = Nothing Command1.Enabled = True Exit Sub acd: MsgBox Err.Description End Sub
方法一: ...... On Error Goto errhandle rtn=Dir("G:\*.*")'G:\为光驱 '光驱若无光盘, 则返回错误, 进入errhandle, Cdin为False; 若有光盘, 则Cdin为Ture Cdin=True errhandle: Cdin=False ......方法二:引用microsoft scripting runtimePrivate Sub Command1_Click() Dim fso As New FileSystemObject Dim dr As Drive
Set dr = fso.GetDrive("j:") If dr.IsReady Then Else MsgBox "no cd" End If
End Sub方法三: 发送WM_DEVICECHANGE消息来判断。The WM_DEVICECHANGE device message notifies an application or device driver of a change to the hardware configuration of a device or the computer.Event = (UINT) wParam; dwData = (DWORD) lParam;
【工程】-->选择【引用】-->选择【Microsoft Scripting Runtime】(Scrrun.dll)
Private Sub Command1_Click()
On Error GoTo acd
Command1.Enabled = False
Dim FSO As FileSystemObject
Dim aDrive As Drive
Set FSO = New FileSystemObject
For Each aDrive In FSO.Drives
If aDrive.DriveType = CDRom And aDrive.IsReady = False Then
MsgBox "光驱中没有光盘!"
Exit For
ElseIf aDrive.DriveType = CDRom Then
MsgBox "光驱中有一张" & aDrive.VolumeName & "光盘"
Exit For
End If
Next
Set FSO = Nothing
Command1.Enabled = True
Exit Sub
acd:
MsgBox Err.Description
End Sub
......
On Error Goto errhandle
rtn=Dir("G:\*.*")'G:\为光驱
'光驱若无光盘, 则返回错误, 进入errhandle, Cdin为False; 若有光盘, 则Cdin为Ture
Cdin=True
errhandle:
Cdin=False
......方法二:引用microsoft scripting runtimePrivate Sub Command1_Click()
Dim fso As New FileSystemObject
Dim dr As Drive
Set dr = fso.GetDrive("j:")
If dr.IsReady Then
Else
MsgBox "no cd"
End If
End Sub方法三:
发送WM_DEVICECHANGE消息来判断。The WM_DEVICECHANGE device message notifies an application or device driver of a change to the hardware configuration of a device or the computer.Event = (UINT) wParam;
dwData = (DWORD) lParam;
http://zealsoft.nease.net/cn/cdnotify还有使用Microsoft SysInfo控件的DeviceArrival、DeviceRemoveComplete事件判断不知是否可以,没用过,可试一下
免费的学习交流网站,欢迎大家访问!
http://www.j2soft.cn/
如果仔细研究一下Windows API函数SHChangeNotify就会发现它可以获得外壳中发生的许多事件的信息,其中包括:文件、目录的变化,媒体设备的插入和卸载,磁盘自由空间的更新等等。比如,当从光驱中放入或取出光盘的时候,资源管理器会自动感知到这些动作,并更新相应光盘驱动器的图标,这就是通过外壳通知(Shell Notification)来实现的。
注册外壳变化通知
接收外壳的变化通知消息的关键是SHChangeNotifyRegister 函数,下面是它的定义:
function SHChangeNotifyRegister(Window: HWND; Flags: DWORD;
EventMask: ULONG; MessageID: UINT; ItemCount: DWORD;
var Items: TNotifyRegister): THandle; stdcall;
它被用来注册一个用来接收所有系统变化消息的窗口。这是一个未经公开的函数,它在SHELL32.DLL中的索引是2。Window 参数指定了用来接收通知消息的窗口,EventMask 参数可以设定为感兴趣的事件的位掩码的组合,可以使用任意的SHCNE_xxx 常数的组合。表2.12提供了全部这些常数的定义。
表2.12
常 数
定 义
SHCNE_ASSOCCHANGED
一个文件关联被改变了
SHCNE_ATTRIBUTES
一个项目或文件夹的属性被改变了
SHCNE_CREATE
非文件夹的外壳成员被创建了
SHCNE_DELETE
非文件夹的外壳成员被删除了
SHCNE_DRIVEADD
添加了一个驱动器
SHCNE_DRIVEADDGUI
通过外壳添加的驱动器
SHCNE_DRIVEREMOVED
一个驱动器被删除了
SHCNE_EXTENDED_EVENT
未被使用
SHCNE_FREESPACE
驱动器的自由空间数有了变化
SHCNE_MEDIAINSERTED
存储介质被插入到驱动器中
SHCNE_MEDIAREMOVED
存储介质从驱动器中被删除
SHCNE_MKDIR
一个目录被创建
SHCNE_NETSHARE
本地的目录被共享
SHCNE_NETUNSHARE
本地目录被取消共享
SHCNE_RENAMEFOLDER
文件夹名称被改变
SHCNE_RENAMEITEM
非文件的外壳对象的名称被改变
SHCNE_RMDIR
一个文件夹被删除
SHCNE_SERVERDISCONNECT
计算机被服务器断开
SHCNE_UPDATEDIR
一个文件夹中的内容被改变
SHCNE_UPDATEIMAGE
系统图像列表中的一个图像被改变
SHCNE_UPDATEITEM
一个非文件夹外壳对象的名称被改变
多个事件组合类型
SHCNE_ALLEVENTS
接收全部事件
SHCNE_DISKEVENTS
接收所有磁盘相关事件
SHCNE_GLOBALEVENT
接收所有全局事件
事件常数使用的标识
SHCNE_INTERRUPT
事件是作为一个系统中断的结果
http://community.csdn.net/Expert/topic/4477/4477632.xml?temp=.288067