下面的代码在WinNT/Win2000下有效,如果是Win98/Win95不能工作 '-------------------------------------------------------- ' I/O control Code ' 详细的信息请参阅: WINIOCTL.H 如果你装了VC的话 Private Const IOCTL_STORAGE_LOAD_MEDIA = 2967564 Private Const IOCTL_STORAGE_EJECT_MEDIA = 2967560 '------------------------------------------------------- ' CreateFile Private Const INVALID_HANDLE_VALUE = -1 Private Const OPEN_EXISTING = 3 Private Const FILE_FLAG_DELETE_ON_CLOSE = 67108864 Private Const GENERIC_READ = &H80000000 Private Const GENERIC_WRITE = &H40000000 Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, lpOverlapped As Any) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Sub Command1_Click() CDRomControl "F:", IOCTL_STORAGE_EJECT_MEDIA End SubPrivate Sub Command2_Click() CDRomControl "F:", IOCTL_STORAGE_LOAD_MEDIA End Sub Private Sub CDRomControl(DriveLetter As String, ByVal Mode As Long) '说明: DriveLetter 为光驱所在的盘符, ' Mode 为标准的IO Control code Dim hDrive As Long, DummyReturnedBytes As Long Dim DriveLetterAndColon As String If Len(DriveLetter) Then 'Confirm the user didn't cancel DriveLetterAndColon = UCase(Left$(DriveLetter & ":", 2)) 'Make it all caps for easy interpretation hDrive = CreateFile("\\.\" & DriveLetterAndColon, GENERIC_READ Or GENERIC_WRITE, 0, ByVal 0, OPEN_EXISTING, 0, 0) If hDrive <> INVALID_HANDLE_VALUE Then 'Eject media! Call DeviceIoControl(hDrive, Mode, 0, 0, 0, 0, DummyReturnedBytes, ByVal 0) Call CloseHandle(hDrive) 'Clean up after ourselves End If End If End Sub
Attribute VB_Name = "mCDROMDoorControl" Option Explicit'//usage(用法): '//Control_CDROM_Door("H:",True) '//eject the "H:" door(弹开H:的门) '//Control_CDROM_Door("H:",False) '//close the "H:" door(关闭H:的门) '// '//Ref:MSDN_DDK '//Auh:yangvb'/* parameter block for MCI_OPEN command message */ Private Type MCI_OPEN_PARMS dwCallback As Long wDeviceID As Long lpstrDeviceType As Long lpstrElementName As String lpstrAlias As String End Type'/* parameter block for MCI_STATUS command message */ Private Type MCI_STATUS_PARMS dwCallback As Long dwReturn As Long dwItem As Long dwTrack As Long End Type'/* flags for dwFlags parameter of MCI_OPEN command message */ Private Const MCI_OPEN_SHAREABLE = &H100 Private Const MCI_OPEN_ELEMENT = &H200 Private Const MCI_OPEN_ALIAS = &H400 Private Const MCI_OPEN_ELEMENT_ID = &H800 Private Const MCI_OPEN_TYPE_ID = &H1000 Private Const MCI_OPEN_TYPE = &H2000Private Const MCI_DEVTYPE_CD_AUDIO = 516Private Const MCI_OPEN = &H803 Private Const MCI_CLOSE = &H804Private Const MCI_SET = &H80D Private Const MCI_WAIT = &H2'/* flags for dwFlags parameter of MCI_SET command message */ Private Const MCI_SET_DOOR_OPEN = &H100 Private Const MCI_SET_DOOR_CLOSED = &H200Private Declare Function mciSendCommand Lib "winmm.dll" Alias "mciSendCommandA" (ByVal wDeviceID As Long, ByVal uMessage As Long, ByVal dwParam1 As Long, dwParam2 As Any) As Long Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As LongPublic Sub Control_CDROM_Door(ByVal sDriver As String, Optional ByVal bEjectOrClose As Boolean = True)
Dim mop As MCI_OPEN_PARMS '//Dim msp As MCI_STATUS_PARMS Dim lRet As Long Dim lFlags As Long
sDriver = Left$(sDriver, 1) & ":\" lFlags = MCI_OPEN_TYPE Or _ MCI_OPEN_TYPE_ID Or _ MCI_OPEN_ELEMENT Or _ MCI_OPEN_SHAREABLE
If Not (mciSendCommand(0, MCI_OPEN, lFlags, mop)) Then
If bEjectOrClose Then lRet = mciSendCommand(mop.wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, ByVal 0&) Else lRet = mciSendCommand(mop.wDeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, ByVal 0&) End If
利用MCI的方法可以方便的实现光驱门的开关。 请看下例: >>步骤1----建立新工程,在窗体上放置一个CommandButton按钮.设置其Caption = "打开" >>步骤2----编写如下代码:Private Declare Function mciSendString Lib "winmm.dll" Alias _ "mciSendStringA" (ByVal lpstrCommand As String, ByVal _ lpstrReturnString As String, ByVal uReturnLength As Long, _ ByVal hwndCallback As Long) As LongPrivate Sub Command1_Click() Static bOpen As Boolean Dim strStr As String If Not bOpen Then Screen.MousePointer = vbHourglass strStr = "set CDAudio door open" Command1.Caption = "关闭" Else Screen.MousePointer = vbHourglass strStr = "set CDAudio door closed" Command1.Caption = "打开" End If Call mciSendString(strStr, vbNull, 127, 0) Screen.MousePointer = vbDefault DoEvents bOpen = Not bOpen End Sub>>步骤3----编译运行,点击"打开",光驱弹出;点击"关闭",光驱关上.
'--------------------------------------------------------
' I/O control Code
' 详细的信息请参阅: WINIOCTL.H 如果你装了VC的话
Private Const IOCTL_STORAGE_LOAD_MEDIA = 2967564
Private Const IOCTL_STORAGE_EJECT_MEDIA = 2967560
'-------------------------------------------------------
' CreateFile
Private Const INVALID_HANDLE_VALUE = -1
Private Const OPEN_EXISTING = 3
Private Const FILE_FLAG_DELETE_ON_CLOSE = 67108864
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, lpOverlapped As Any) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Sub Command1_Click()
CDRomControl "F:", IOCTL_STORAGE_EJECT_MEDIA
End SubPrivate Sub Command2_Click()
CDRomControl "F:", IOCTL_STORAGE_LOAD_MEDIA
End Sub
Private Sub CDRomControl(DriveLetter As String, ByVal Mode As Long)
'说明: DriveLetter 为光驱所在的盘符,
' Mode 为标准的IO Control code
Dim hDrive As Long, DummyReturnedBytes As Long
Dim DriveLetterAndColon As String
If Len(DriveLetter) Then 'Confirm the user didn't cancel
DriveLetterAndColon = UCase(Left$(DriveLetter & ":", 2)) 'Make it all caps for easy interpretation
hDrive = CreateFile("\\.\" & DriveLetterAndColon, GENERIC_READ Or GENERIC_WRITE, 0, ByVal 0, OPEN_EXISTING, 0, 0)
If hDrive <> INVALID_HANDLE_VALUE Then
'Eject media!
Call DeviceIoControl(hDrive, Mode, 0, 0, 0, 0, DummyReturnedBytes, ByVal 0)
Call CloseHandle(hDrive) 'Clean up after ourselves
End If
End If
End Sub
Option Explicit'//usage(用法):
'//Control_CDROM_Door("H:",True) '//eject the "H:" door(弹开H:的门)
'//Control_CDROM_Door("H:",False) '//close the "H:" door(关闭H:的门)
'//
'//Ref:MSDN_DDK
'//Auh:yangvb'/* parameter block for MCI_OPEN command message */
Private Type MCI_OPEN_PARMS
dwCallback As Long
wDeviceID As Long
lpstrDeviceType As Long
lpstrElementName As String
lpstrAlias As String
End Type'/* parameter block for MCI_STATUS command message */
Private Type MCI_STATUS_PARMS
dwCallback As Long
dwReturn As Long
dwItem As Long
dwTrack As Long
End Type'/* flags for dwFlags parameter of MCI_OPEN command message */
Private Const MCI_OPEN_SHAREABLE = &H100
Private Const MCI_OPEN_ELEMENT = &H200
Private Const MCI_OPEN_ALIAS = &H400
Private Const MCI_OPEN_ELEMENT_ID = &H800
Private Const MCI_OPEN_TYPE_ID = &H1000
Private Const MCI_OPEN_TYPE = &H2000Private Const MCI_DEVTYPE_CD_AUDIO = 516Private Const MCI_OPEN = &H803
Private Const MCI_CLOSE = &H804Private Const MCI_SET = &H80D
Private Const MCI_WAIT = &H2'/* flags for dwFlags parameter of MCI_SET command message */
Private Const MCI_SET_DOOR_OPEN = &H100
Private Const MCI_SET_DOOR_CLOSED = &H200Private Declare Function mciSendCommand Lib "winmm.dll" Alias "mciSendCommandA" (ByVal wDeviceID As Long, ByVal uMessage As Long, ByVal dwParam1 As Long, dwParam2 As Any) As Long
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As LongPublic Sub Control_CDROM_Door(ByVal sDriver As String, Optional ByVal bEjectOrClose As Boolean = True)
Dim mop As MCI_OPEN_PARMS
'//Dim msp As MCI_STATUS_PARMS
Dim lRet As Long
Dim lFlags As Long
sDriver = Left$(sDriver, 1) & ":\"
lFlags = MCI_OPEN_TYPE Or _
MCI_OPEN_TYPE_ID Or _
MCI_OPEN_ELEMENT Or _
MCI_OPEN_SHAREABLE
mop.lpstrDeviceType = MCI_DEVTYPE_CD_AUDIO
mop.lpstrElementName = sDriver
If Not (mciSendCommand(0, MCI_OPEN, lFlags, mop)) Then
If bEjectOrClose Then
lRet = mciSendCommand(mop.wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, ByVal 0&)
Else
lRet = mciSendCommand(mop.wDeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, ByVal 0&)
End If
lRet = mciSendCommand(mop.wDeviceID, MCI_CLOSE, MCI_WAIT, ByVal 0&)
End If
End Sub
是不是关光驱怎么播CD啊我回去试一下
明天来给你加分
请看下例:
>>步骤1----建立新工程,在窗体上放置一个CommandButton按钮.设置其Caption = "打开"
>>步骤2----编写如下代码:Private Declare Function mciSendString Lib "winmm.dll" Alias _
"mciSendStringA" (ByVal lpstrCommand As String, ByVal _
lpstrReturnString As String, ByVal uReturnLength As Long, _
ByVal hwndCallback As Long) As LongPrivate Sub Command1_Click()
Static bOpen As Boolean
Dim strStr As String If Not bOpen Then
Screen.MousePointer = vbHourglass
strStr = "set CDAudio door open"
Command1.Caption = "关闭"
Else
Screen.MousePointer = vbHourglass
strStr = "set CDAudio door closed"
Command1.Caption = "打开"
End If Call mciSendString(strStr, vbNull, 127, 0)
Screen.MousePointer = vbDefault
DoEvents
bOpen = Not bOpen
End Sub>>步骤3----编译运行,点击"打开",光驱弹出;点击"关闭",光驱关上.
我知道如何知道光驱内是否有可用的光盘
但也不知道他到底是开的还是关的 谁知道?
我开新贴问(100分)我本来想100分都给 kensu() 的
但是VirtualAlloc(呵呵(★★★★★)) 的方法好象更好(我没试)
你们73 开吧
请看
http://expert.csdn.net/Expert/topic/1472/1472836.xml?temp=.1096613