回 帖 发 新 帖 刷新版面

主题:win7系统下自编播放器调节音量的代码

win7系统下自编播放器调节音量的代码

自己编写的播放器,在XP系统中运行正常,在win7系统中却不能调节音量,究其原因,是两个调节音量的API函数waveOutSetVolume和waveOutGetVolume都不能正常运行。幸好天无绝人之路,还有一个API消息函数SendMessage可以利用。
在窗体上添加3个按纽,其Index属性分别为0、1、2,其标题分别为音量增、音量减、静音。代码如下:

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long

Private Const WM_APPCOMMAND As Long = &H319
Private Const APPCOMMAND_VOLUME_UP As Long = 10
Private Const APPCOMMAND_VOLUME_DOWN As Long = 9
Private Const APPCOMMAND_VOLUME_MUTE As Long = 8

Private Sub Command1_Click(Index As Integer)
Select Case Index
  Case 0: SendMessage Me.hwnd, WM_APPCOMMAND, &H30292, APPCOMMAND_VOLUME_UP * &H10000    '音量+
  Case 1: SendMessage Me.hwnd, WM_APPCOMMAND, &H30292, APPCOMMAND_VOLUME_DOWN * &H10000  '音量-
  Case 2: SendMessage Me.hwnd, WM_APPCOMMAND, &H200EB0, APPCOMMAND_VOLUME_MUTE * &H10000 '静音
End Select
End Sub

代码简捷明了,没有什么可说的,唯一要注意的,是SendMessage函数的最后一个参数的写法。一般的写法是:lParam As Any,而在本代码中,最后一个参数的类型是Any还是Long并不重要,重要的是前面一定要加上ByVal这个关键字。如果没有这个关键字,那么你点击按纽,只会调出系统的计算器,不会调节音量,令人哭笑不得。另外,建议你在函数名称后面加一个字母,例如SendMessageB(注意调用时名称后面也要加上这个字母),这样就不会与你早先声明的SendMessage相冲突(如果你的程序中总共只声明了这一个SendMessage,那就不必多此一举了)。
为了美观,这3个按纽可以设置成圆形或者椭圆形的,需要添加以下代码:

Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, _
    ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, _
    ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private Sub Form_Load()
Dim hdc As Long, i As Integer
For i = 0 To 2
  hdc = CreateEllipticRgn(3, 3, 45, 45) '创建圆形或椭圆形的音量按纽
  SetWindowRgn Command1(i).hwnd, hdc, True
  DeleteObject hdc
Next
End Sub

注意CreateEllipticRgn函数的几个参数值是要根据按纽大小而变化的,我这个代码中的按纽尺寸是735×735。
同时你还可将按纽的Style属性设置为1,这样就能够为按纽披上彩色的外衣,更显炫酷。


回复列表 (共2个回复)

沙发

代码不长,涉及的内容不少。

需要认真学习领会。

板凳

代码简捷明了,没有什么可说的,唯一要注意的,是SendMessage函数的最后一个参数的写法。一般的写法是:lParam As Any,而在本代码中,最后一个参数的类型是Any还是Long并不重要,重要的是前面一定要加上ByVal这个关键字。如果没有这个关键字,那么你点击按纽,只会调出系统的计算器,不会调节音量,令人哭笑不得。另外,建议你在函数名称后面加一个字母,例如SendMessageB(注意调用时名称后面也要加上这个字母),这样就不会与你早先声明的SendMessage相冲突(如果你的程序中总共只声明了这一个SendMessage,那就不必多此一举了)。

https://1687580.com/view/fc3D/index.html

https://1687580.com/view/tcpl3/index.html

https://1687580.com/view/kl8/kl8_index.html

https://1688363.com/?=kaijiang

我来回复

您尚未登录,请登录后再回复。点此登录或注册