呵呵, 注册表找一下不就知道了 ? 我的是 2000系统, XP应该差不多吧 ? 就照这个思路吧.我特地装了一个刻录光驱来测试, 下面代码在我2000的系统没问题.'添加 Command1Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long Const HKEY_LOCAL_MACHINE = &H80000002 Const REG_SZ = 1 Dim Ret Private Sub Command1_Click() '查看 Ret = GetString(HKEY_LOCAL_MACHINE, "system\currentcontrolset\services\cdrom\ENUm", "0") If Ret <> "" Then If InStr(Ret, "CD-RW") > 0 Then MsgBox "刻录机" Else MsgBox "普通光驱" End If Else MsgBox "无光驱" End If End SubFunction GetString(hKey As Long, strPath As String, strValue As String) RegOpenKey hKey, strPath, Ret GetString = RegQueryStringValue(Ret, strValue) RegCloseKey Ret End FunctionFunction RegQueryStringValue(ByVal hKey As Long, ByVal strValueName As String) As String Dim lResult&, lValueType&, strBuf$, lDataBufSize& lResult = RegQueryValueEx(hKey, strValueName, 0, lValueType, ByVal 0, lDataBufSize) If lResult = 0 Then If lValueType = REG_SZ Then strBuf = String(lDataBufSize, Chr$(0)) lResult = RegQueryValueEx(hKey, strValueName, 0, 0, ByVal strBuf, lDataBufSize) If lResult = 0 Then RegQueryStringValue = Left$(strBuf, InStr(1, strBuf, Chr$(0)) - 1) ElseIf lValueType = REG_BINARY Then Dim strData% lResult = RegQueryValueEx(hKey, strValueName, 0, 0, strData, lDataBufSize) If lResult = 0 Then RegQueryStringValue = strData End If End If End Function
No, CDROM 与 CD-RW 是通用的名称只要是正规的厂商都遵循这个规则,就算没有的话,可以如同病毒库一样, 搜集一些可能的名称, 不会有太多种的. If InStr(Ret, "CD-RW") > 0 or InStr(Ret, "CDRW") > 0 or InStr(Ret, "刻录机") > 0 Then
Attn:13F抱歉DVD没试过,但是If InStr(Ret, "CD-RW") > 0 or InStr(Ret, "DVD") > 0 Then '应该可行
这个貌似不错,不过没有硬件条件测试
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Const HKEY_LOCAL_MACHINE = &H80000002
Const REG_SZ = 1
Dim Ret
Private Sub Command1_Click() '查看
Ret = GetString(HKEY_LOCAL_MACHINE, "system\currentcontrolset\services\cdrom\ENUm", "0")
If Ret <> "" Then
If InStr(Ret, "CD-RW") > 0 Then
MsgBox "刻录机"
Else
MsgBox "普通光驱"
End If
Else
MsgBox "无光驱"
End If
End SubFunction GetString(hKey As Long, strPath As String, strValue As String)
RegOpenKey hKey, strPath, Ret
GetString = RegQueryStringValue(Ret, strValue)
RegCloseKey Ret
End FunctionFunction RegQueryStringValue(ByVal hKey As Long, ByVal strValueName As String) As String
Dim lResult&, lValueType&, strBuf$, lDataBufSize&
lResult = RegQueryValueEx(hKey, strValueName, 0, lValueType, ByVal 0, lDataBufSize)
If lResult = 0 Then
If lValueType = REG_SZ Then
strBuf = String(lDataBufSize, Chr$(0))
lResult = RegQueryValueEx(hKey, strValueName, 0, 0, ByVal strBuf, lDataBufSize)
If lResult = 0 Then RegQueryStringValue = Left$(strBuf, InStr(1, strBuf, Chr$(0)) - 1)
ElseIf lValueType = REG_BINARY Then
Dim strData%
lResult = RegQueryValueEx(hKey, strValueName, 0, 0, strData, lDataBufSize)
If lResult = 0 Then RegQueryStringValue = strData
End If
End If
End Function
那DVD-RW是不是代表DVD刻录机?
这个方法我也想过,不过后来发现很多品牌的刻录机都不包含RW等字符
所以没有继续试这个方法,因为这串字符是生产厂家按自己的定的格式随意定的,没有通用性
DVD_R
0x80000000
MEDIA_ERASEABLE
0x00000001
MEDIA_READ_ONLY
0x00000004
MEDIA_READ_WRITE
0x00000008
MEDIA_WRITE_ONCE
0x00000002
MEDIA_WRITE_PROTECTED
0x00000100
当然如果只是想判断是不是刻录机而不用判断刻录机内光盘的详细信息的话可以参考MediaType成员,这是一个STORAGE_MEDIA_TYPE枚举。具体参照MSDN:
GET_MEDIA_TYPES Structure:
http://msdn.microsoft.com/en-us/library/aa363264(VS.85).aspxDEVICE_MEDIA_INFO Structure:
http://msdn.microsoft.com/en-us/library/aa363241(v=VS.85).aspxSTORAGE_MEDIA_TYPE Enumeration:
http://msdn.microsoft.com/en-us/library/aa363467(v=VS.85).aspx