vb调节音量代码

Option Explicit

Private Declare Function mixerGetNumDevs Lib "winmm.dll" () As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function mixerClose Lib "winmm.dll" (ByVal hmx As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Sub CopyPtrFromStruct Lib "kernel32" Alias "RtlMoveMemory" (ByVal ptr As Long, struct As Any, ByVal cb As Long)
Private Declare Sub CopyStructFromPtr Lib "kernel32" Alias "RtlMoveMemory" (struct As Any, ByVal ptr As Long, ByVal cb As Long)
Private Declare Function mixerSetControlDetails Lib "winmm.dll" (ByVal hmxobj As Long, pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Long) As Long
Private Declare Function mixerGetLineInfo Lib "winmm.dll" Alias "mixerGetLineInfoA" (ByVal hmxobj As Long, pmxl As MIXERLINE, ByVal fdwInfo As Long) As Long
Private Declare Function mixerGetDevCaps Lib "winmm.dll" Alias "mixerGetDevCapsA" (ByVal uMxId As Long, pmxcaps As MIXERCAPS, ByVal cbmxcaps As Long) As Long
Private Declare Function mixerOpen Lib "winmm.dll" (phmx As Long, ByVal uMxId As Long, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal fdwOpen As Long) As Long
Private Declare Function mixerGetLineControls Lib "winmm.dll" Alias "mixerGetLineControlsA" (ByVal hmxobj As Long, pmxlc As MIXERLINECONTROLS, ByVal fdwControls As Long) As Long
Private Declare Function mixerGetControlDetails Lib "winmm.dll" Alias "mixerGetControlDetailsA" (ByVal hmxobj As Long, pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Long) As Long

Private Const MAXPNAMElen = 32 ' max product name length (including NULL)
Private Const MMSYSERR_NOERROR = 0 ' no error
Private Const GMEM_ZEROINIT = &H40
Private Const CALLBACK_WINDOW = &H10000 ' dwCallback is a HWND
Private Const MIXER_OBJECTF_MIXER = &H0&
Private Const MIXER_LONG_NAME_CHARS = 64
Private Const MIXER_SHORT_NAME_CHARS = 16
Private Const MIXER_GETLINEINFOF_SOURCE = &H1&
Private Const MIXER_OBJECTF_HANDLE = &H80000000
Private Const MIXER_SETCONTROLDETAILSF_VALUE = &H0&
Private Const MIXER_GETCONTROLDETAILSF_VALUE = &H0&
Private Const MIXERCONTROL_CT_UNITS_BOOLEAN = &H10000
Private Const MIXER_GETLINECONTROLSF_ONEBYTYPE = &H2&
Private Const MIXER_GETLINEINFOF_COMPONENTTYPE = &H3&
Private Const MIXERCONTROL_CT_CLASS_FADER = &H50000000
Private Const MIXERCONTROL_CT_UNITS_UNSIGNED = &H30000
Private Const MIXERCONTROL_CT_SC_SWITCH_BOOLEAN = &H0&
Private Const MIXERLINE_COMPONENTTYPE_DST_FIRST = &H0&
Private Const MIXERCONTROL_CT_CLASS_SWITCH = &H20000000
Private Const MIXER_OBJECTF_HMIXER = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_MIXER)
Private Const MIXERCONTROL_CONTROLTYPE_FADER = (MIXERCONTROL_CT_CLASS_FADER Or MIXERCONTROL_CT_UNITS_UNSIGNED)
Private Const MIXERCONTROL_CONTROLTYPE_VOLUME = (MIXERCONTROL_CONTROLTYPE_FADER + 1)
Private Const MIXERCONTROL_CONTROLTYPE_BOOLEAN = (MIXERCONTROL_CT_CLASS_SWITCH Or MIXERCONTROL_CT_SC_SWITCH_BOOLEAN Or MIXERCONTROL_CT_UNITS_BOOLEAN)
Private Const MIXERCONTROL_CONTROLTYPE_MUTE = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2)
Private Const MIXERLINE_COMPONENTTYPE_DST_SPEAKERS = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 4)

Private Type MIXERCONTROLDETAILS_SIGNED
lValue As Long
End Type
Private Type MIXERCONTROLDETAILS_BOOLEAN
fValue As Long
End Type
'''''''''''''''''''''''''''''''''''''''''''''''
'自己定义的类型
Private Type MIXERCONTROLDETAILS_SIGNED_ARRAY_2
v1 As MIXERCONTROLDETAILS_SIGNED
v2 As MIXERCONTROLDETAILS_SIGNED
End Type
'''''''''''''''''''''''''''''''''''''''''''''''
Private Type MIXERCONTROLDETAILS
cbStruct As Long ' size in Byte of MIXERCONTROLDETAILS
dwControlID As Long ' control id to get/set details on
cChannels As Long ' number of channels in paDetails array
item As Long ' hwndOwner or cMultipleItems
cbDetails As Long ' size of _one_ details_XX struct
paDetails As Long ' pointer to array of details_XX structs
End Type
Private Type MIXERCAPS
wMid As Integer ' manufacturer id
wPid As Integer ' product id
vDriverVersion As Long ' version of the driver
szPname As String * MAXPNAMElen ' product name
fdwSupport As Long ' misc. support bits
cDestinations As Long ' count of destinations
End Type
Private Type Target ' for use in MIXERLINE and others (embedded structure)

dwType As Long ' MIXERLINE_TARGETTYPE_xxxx
dwDeviceID As Long ' target device ID of device type
wMid As Integer ' of target device
wPid As Integer ' "
vDriverVersion As Long ' "
szPname As String * MAXPNAMElen
End Type
Private Type MIXERCONTROL
cbStruct As Long ' size in Byte of MIXERCONTROL
dwControlID As Long ' unique control id for mixer device
dwControlType As Long ' MIXERCONTROL_CONTROLTYPE_xxx
fdwControl As Long ' MIXERCONTROL_CONTROLF_xxx
cMultipleItems As Long ' if MIXERCONTROL_CONTROLF_MULTIPLE set
szShortName As String * MIXER_SHORT_NAME_CHARS
szName As String * MIXER_LONG_NAME_CHARS
Bounds(1 To 6) As Long ' Longest member of the Bounds union
Metrics(1 To 6) As Long ' Longest member of the Metrics union
End Type
Private Type MIXERLINECONTROLS
cbStruct As Long ' size in Byte of MIXERLINECONTROLS
dwLineID As Long ' line id (from MIXERLINE.dwLineID)
' MIXER_GETLINECONTROLSF_ONEBYID or
dwControl As Long ' MIXER_GETLINECONTROLSF_ONEBYTYPE
cControls As Long ' count of controls pmxctrl points to
cbmxctrl As Long ' size in Byte of _one_ MIXERCONTROL
pamxctrl As Long ' pointer to first MIXERCONTROL array
End Type
Private Type MIXERLINE
cbStruct As Long ' size of MIXERLINE structure
dwDestination As Long ' zero based destination index
dwSource As Long ' zero based source index (if source)
dwLineID As Long ' unique line id for mixer device
fdwLine As Long ' state/information about line
dwUser As Long ' driver specific information
dwComponentType As Long ' component type line connects to
cChannels As Long ' number of channels line supports
cConnections As Long ' number of connections (possible)
cControls As Long ' number of controls at this line
szShortName As String * MIXER_SHORT_NAME_CHARS
szName As String * MIXER_LONG_NAME_CHARS
tTarget As Target
End Type

'最大最小音量
Private m_lMax As Long, m_lMin As Long
'打开的设备句柄
Private m_hMixer As Long
'设备数GetDevNum
Private m_lDeviceNum As Long
'设备ID
Private m_lDeviceID As Long
'设备功能GetDevCaps
Private m_Caps As MIXERCAPS

'打开设备以调节音量
Public Function OpenDeviceForVolume() As Boolean

OpenDeviceForVolume = False

'系统中混频器的总数量
If (mixerGetNumDevs() <> 0) Then
'打开设备
If mixerOpen(m_hMixer, 0, 0, 0, MIXER_OBJECTF_MIXER Or CALLBACK_WINDOW) <> MMSYSERR_NOERROR Then
Exit Function
End If
'获取设备能力
If mixerGetDevCaps(m_hMixer, m_Caps, Len(m_Caps)) <> MMSYSERR_NOERROR Then
Exit Function
End If
End If

'如果打开失败
If m_hMixer = 0 Then Exit Function

Dim mxl As MIXERLINE
Dim mxc As MIXERCONTROL
Dim mxlc As MIXERLINECONTROLS
Dim hMem As Long

hMem = GlobalAlloc(GMEM_ZEROINIT, Len(mxc))

mxl.cbStruct = Len(mxl)
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
If mixerGetLineInfo(m_hMixer, mxl, MIXER_OBJECTF_HMIXER Or MIXER_GETLINEINFOF_COMPONENTTYPE) <> MMSYSERR_NOERROR Then
Exit Function
End If

m_lDeviceNum = mxl.cChannels

mxlc.cbStruct = Len(mxlc)
mxlc.dwLineID = mxl.dwLineID
mxlc.dwControl = MIXERCONTROL_CONTROLTYPE_VOLUME
mxlc.cControls = 1
mxlc.cbmxctrl = Len(mxc)
mxlc.pamxctrl = GlobalLock(hMem)

If mixerGetLineControls(m_hMixer, mxlc, MIXER_OBJECTF_HMIXER Or MIXER_GETLINECONTROLSF_ONEBYTYPE) <> MMSYSERR_NOERROR Then
GlobalUnlock hMem
GlobalFree hMem
Exit Function
End If

CopyStructFromPtr mxc, mxlc.pamxctrl, Len(mxc)
m_lDeviceID = mxc.dwControlID
m_lMin = mxc.Bounds(1)
m_lMax = mxc.Bounds(2)

GlobalUnlock hMem
GlobalFree hMem
OpenDeviceForVolume = True
End Function

'打开设备以设置静音
Public Function OpenDeviceForMute() As Boolean

OpenDeviceForMute = False

'不懂
If (mixerGetNumDevs() <> 0) Then
'打开设备
If mixerOpen(m_hMixer, 0, 0, 0, MIXER_OBJECTF_MIXER Or CALLBACK_WINDOW) <> MMSYSERR_NOERROR Then
Exit Function
End If
'获取设备能力
If mixerGetDevCaps(m_hMixer, m_Caps, Len(m_Caps)) <> MMSYSERR_NOERROR Then
Exit Function
End If
End If

'如果打开失败
If m_hMixer = 0 Then Exit Function

Dim mxl As MIXERLINE
Dim mxc As MIXERCONTROL
Dim mxlc As MIXERLINECONTROLS
Dim hMem As Long

hMem = GlobalAlloc(GMEM_ZEROINIT, Len(mxc))

mxl.cbStruct = Len(mxl)
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
If mixerGetLineInfo(m_hMixer, mxl, MIXER_OBJECTF_HMIXER Or MIXER_GETLINEINFOF_COMPONENTTYPE) <> MMSYSERR_NOERROR Then
Exit Function
End If

m_lDeviceNum = mxl.cChannels

mxlc.cbStruct = Len(mxlc)
mxlc.dwLineID = mxl.dwLineID
mxlc.dwControl = MIXERCONTROL_CONTROLTYPE_MUTE
mxlc.cControls = 1
mxlc.cbmxctrl = Len(mxc)
mxlc.pamxctrl = GlobalLock(hMem)

If mixerGetLineControls(m_hMixer, mxlc, MIXER_OBJECTF_HMIXER Or MIXER_GETLINECONTROLSF_ONEBYTYPE) <> MMSYSERR_NOERROR Then
GlobalUnlock hMem
GlobalFree hMem
Exit Function
End If

CopyStructFromPtr mxc, mxlc.pamxctrl, Len(mxc)
m_lDeviceID = mxc.dwControlID

GlobalUnlock hMem
GlobalFree hMem
OpenDeviceForMute = True
End Function

'关闭打开的设备
Public Function CloseDevice() As Boolean
CloseDevice = False

If m_hMixer <> 0 Then
mixerClose m_hMixer
m_hMixer = 0
End If

CloseDevice = True
End Function

'设置音量
Public Function SetVolume(ByVal lVol As Long, ByVal rVol As Long) As Boolean
SetVolume = False

'如果设备未打开
If m_hMixer = 0 Then Exit Function

Dim mxcdVolume As MIXERCONTROLDETAILS_SIGNED_ARRAY_2
Dim mxcd As MIXERCONTROLDETAILS
Dim hMem As Long

hMem = GlobalAlloc(GMEM_ZEROINIT, Len(mxcdVolume))

mxcdVolume.v1.lValue = lVol
mxcdVolume.v2.lValue = rVol
mxcd.cbStruct = Len(mxcd)
mxcd.dwControlID = m_lDeviceID
mxcd.cChannels = m_lDeviceNum
mxcd.item = 0
mxcd.cbDetails = Len(mxcdVolume.v1)
mxcd.paDetails = GlobalLock(hMem)
CopyPtrFromStruct mxcd.paDetails, mxcdVolume, Len(mxcdVolume)

If mixerSetControlDetails(m_hMixer, mxcd, MIXER_OBJECTF_HMIXER Or MIXER_SETCONTROLDETAILSF_VALUE) <> MMSYSERR_NOERROR Then
GlobalUnlock (hMem)
GlobalFree (hMem)
Exit Function
End If

GlobalUnlock (hMem)
GlobalFree (hMem)
SetVolume = True
End Function

'获取当前音量
Public Function GetVolume(ByRef lVol As Long, ByRef rVol As Long) As Boolean

GetVolume = False
lVol = -1
rVol = -1

'如果设备未打开
If m_hMixer = 0 Then Exit Function

Dim mxcdVolume As MIXERCONTROLDETAILS_SIGNED_ARRAY_2
Dim mxcd As MIXERCONTROLDETAILS
Dim hMem As Long

hMem = GlobalAlloc(GMEM_ZEROINIT, Len(mxcdVolume))

mxcd.cbStruct = Len(mxcd)
mxcd.dwControlID = m_lDeviceID
mxcd.cChannels = m_lDeviceNum
mxcd.item = 0
mxcd.cbDetails = Len(mxcdVolume.v1)
mxcd.paDetails = GlobalLock(hMem)

If mixerGetControlDetails(m_hMixer, mxcd, MIXER_OBJECTF_HMIXER Or MIXER_GETCONTROLDETAILSF_VALUE) <> MMSYSERR_NOERROR Then
GlobalUnlock (hMem)
GlobalFree (hMem)
Exit Function
End If

CopyStructFromPtr mxcdVolume, mxcd.paDetails, Len(mxcdVolume)

lVol = mxcdVolume.v1.lValue
If m_lDeviceNum = 2 Then
rVol = mxcdVolume.v2.lValue
End If

GlobalUnlock (hMem)
GlobalFree (hMem)
GetVolume = True
End Function

'获取当前是否静音状态
Public Function GetMute(ByRef bMute As Boolean) As Boolean
GetMute = False

If m_hMixer = 0 Then Exit Function

Dim mxcdMute As MIXERCONTROLDETAILS_BOOLEAN
Dim mxcd As MIXERCONTROLDETAILS
mxcd.cbStruct = Len(mxcd)
mxcd.dwControlID = m_lDeviceID
mxcd.cChannels = 1
mxcd.item = 0
mxcd.cbDetails = Len(mxcdMute)
mxcd.paDetails = VarPtr(mxcdMute)
If mixerGetControlDetails(m_hMixer, mxcd, MIXER_OBJECTF_HMIXER Or MIXER_GETCONTROLDETAILSF_VALUE) <> MMSYSERR_NOERROR Then
Exit Function
End If

If mxcdMute.fValue <> 0 Then
bMute = True
Else
bMute = False
End If

GetMute = True
End Function

'设置静音
'参数为是否静音.
Public Function SetMute(ByVal bMute As Boolean) As Boolean
SetMute = False

If m_hMixer = 0 Then Exit Function

Dim hMem As Long
Dim mxcdMute As MIXERCONTROLDETAILS_BOOLEAN
Dim mxcd As MIXERCONTROLDETAILS

mxcdMute.fValue = IIf(bMute, 1, 0)
hMem = GlobalAlloc(GMEM_ZEROINIT, Len(mxcdMute.fValue))

mxcd.cbStruct = Len(mxcd)
mxcd.dwControlID = m_lDeviceID
mxcd.cChannels = 1
mxcd.item = 0
mxcd.cbDetails = Len(mxcdMute)
mxcd.paDetails = GlobalLock(hMem)

CopyPtrFromStruct mxcd.paDetails, mxcdMute, Len(mxcdMute)

If mixerSetControlDetails(m_hMixer, mxcd, MIXER_OBJECTF_HMIXER Or MIXER_SETCONTROLDETAILSF_VALUE) <> MMSYSERR_NOERROR Then
GlobalUnlock hMem
GlobalFree hMem
Exit Function
End If

GlobalUnlock hMem
GlobalFree hMem
SetMute = True
End Function

'获取最大音量
Public Function GetMaxVolume() As Long
GetMaxVolume = IIf(m_hMixer = 0, -1, m_lMax)
End Function

'获取最小音量
Public Function GetMinVolume() As Long
GetMinVolume = IIf(m_hMixer = 0, -1, m_lMin)
End Function

Private Sub Class_Initialize()
m_hMixer = 0
m_lMax = -1
m_lMin = -1
End Sub

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值