[源代码]系统音量控制
2010-12-20 09:38
811 查看
因为网上关于API控制系统音量的资料都是C++的,于是我先用C++写了个。这个程序能设置系统的当前音量。有时间用汇编再写一遍,主要里面的用到的结构定义很繁琐。一份好的参考资料:
http://202.38.64.13/personal/cs011/csli/vc_note/MIXER.htm
PS:无语掉。程序拿到Win7后说不行。在CSDN上查说,Vista之后,设置全局的音量的话用ISimpleAudioVolume::SetMasterVolume 。。。。
http://topic.csdn.net/u/20100930/18/f6ad08c7-43e6-4c23-a70f-3c8a3cd4f06c.html
无奈说下面是XP版控制音量:
Win7版:
参考资料:
http://msdn.microsoft.com/en-us/library/dd370892(v=VS.85).aspx
http://www.cnblogs.com/gingerjws/archive/2010/10/28/1863560.html
http://audacity.googlecode.com/svn-history/r10708/audacity-src/vendor/portaudio-v19/current/src/hostapi/wasapi/mingw-include/mmdeviceapi.h
http://www.portaudio.com/docs/v19-doxydocs/endpointvolume_8h-source.html
.386
.model flat,stdcall
option casemap:none
include e:/masm32/include/windows.inc
include e:/masm32/include/kernel32.inc
includelib e:/masm32/lib/kernel32.lib
include e:/masm32/include/user32.inc
includelib e:/masm32/lib/user32.lib
include e:/masm32/include/ole32.inc
includelib e:/masm32/lib/ole32.lib
eRender equ 0
eConsole equ 0
.data?
lpEnumerator dd ?
lpDevice dd ?
lpAudioEndpointVolume dd ?
fLevel dd ?
bMute db ?
szBuffer db 32 dup (?)
.data
;CLSID_MMDeviceEnumerator = {BCDE0395-E52F-467C-8E3D-C4579291692E}
;IID_IMMDeviceEnumerator = {A95664D2-9614-4F35-A746-DE8DB63617E6}
;IID_IAudioEndpointVolume = {5CDF2C82-841E-4546-9722-0CF74078229A}
CLSID_MMDeviceEnumerator GUID <0BCDE0395h,0E52Fh,467Ch,<8Eh,3Dh,0C4h,57h,92h,91h,69h,2Eh>>
IID_IMMDeviceEnumerator GUID <0A95664D2h,9614h,4F35h,<0A7h,46h,0DEh,8Dh,0B6h,36h,17h,0E6h>>
IID_IAudioEndpointVolume GUID <5CDF2C82h,841Eh,4546h,<97h,22h,0Ch,0F7h,40h,78h,22h,9Ah>>
.code
_MsgBoxHex proc uses ebx edi esi,_dwInt
local @szBuffer[9]:byte
local @szFormat[5]:byte
push eax
mov @szFormat[0],'%'
mov @szFormat[1],'0'
mov @szFormat[2],'8'
mov @szFormat[3],'X'
mov @szFormat[4],0
invoke wsprintf,addr @szBuffer,addr @szFormat,_dwInt
invoke MessageBox,NULL,addr @szBuffer,addr @szFormat,MB_OK
pop eax
ret
_MsgBoxHex endp
start:
invoke CoInitialize,NULL
invoke CoCreateInstance,offset CLSID_MMDeviceEnumerator,NULL,/
CLSCTX_INPROC_SERVER,offset IID_IMMDeviceEnumerator,/
offset lpEnumerator
;Enumerator.GetDefaultAudioEndpoint方法
mov esi,lpEnumerator
mov esi,[esi]
push offset lpDevice
push eConsole
push eRender
push lpEnumerator
call dword ptr [esi+16]
;Device.Activate方法
mov esi,lpDevice
mov esi,[esi]
push offset lpAudioEndpointVolume
push NULL
push CLSCTX_ALL
push offset IID_IAudioEndpointVolume
push lpDevice
call dword ptr [esi+12]
;AudioEndpointVolume.GetMasterVolumeLevelScalar方法,获取音量大小
mov esi,lpAudioEndpointVolume
mov esi,[esi]
push offset fLevel
push lpAudioEndpointVolume
call dword ptr [esi+36]
;显示fLevelDB在内存中的浮点型数据
invoke _MsgBoxHex,fLevel
;此处将令fLevel为3F333333h,即0.7
mov fLevel,3F333333h
;AudioEndpointVolume.SetMasterVolumeLevelScalar方法,设置音量大小,设置范围0~1
mov esi,lpAudioEndpointVolume
mov esi,[esi]
push NULL
push fLevel
push lpAudioEndpointVolume
call dword ptr [esi+28]
;AudioEndpointVolume.GetMute方法,获取静音状态
;mov esi,lpAudioEndpointVolume
;mov esi,[esi]
;push offset bMute
;push lpAudioEndpointVolume
;call dword ptr [esi+60]
;AudioEndpointVolume.SetMute方法,更改静音状态
;mov esi,lpAudioEndpointVolume
;mov esi,[esi]
;push NULL
;not bMute
;movzx eax,bMute
;push eax
;push lpAudioEndpointVolume
;call dword ptr [esi+56]
;Release方法
mov esi,lpAudioEndpointVolume
mov esi,[esi]
push lpAudioEndpointVolume
call dword ptr [esi+8]
mov esi,lpDevice
mov esi,[esi]
push lpDevice
call dword ptr [esi+8]
mov esi,lpEnumerator
mov esi,[esi]
push lpEnumerator
call dword ptr [esi+8]
invoke CoUninitialize
invoke ExitProcess,NULL
end start
http://202.38.64.13/personal/cs011/csli/vc_note/MIXER.htm
PS:无语掉。程序拿到Win7后说不行。在CSDN上查说,Vista之后,设置全局的音量的话用ISimpleAudioVolume::SetMasterVolume 。。。。
http://topic.csdn.net/u/20100930/18/f6ad08c7-43e6-4c23-a70f-3c8a3cd4f06c.html
无奈说下面是XP版控制音量:
#include<stdio.h>#include<windows.h>#include<mmsystem.h>#pragma comment(lib,"Winmm.lib")void main(){ HMIXER hMixer; //mixer设备的句柄 UINT uMxId; //设备ID MMRESULT mr; //返回类型 MIXERLINE mxl; MIXERCONTROL mxc; MIXERLINECONTROLS mxlc; MIXERCONTROLDETAILS mxcd; MIXERCONTROLDETAILS_UNSIGNED mxcd_u; //检测系统是否有设备 printf("设备数量:/t%d/n",mixerGetNumDevs()); if(mixerGetNumDevs() == 0) return; //得到设备句柄 printf("请输入设备ID:/t"); scanf("%d",&uMxId); mr = mixerOpen(&hMixer,uMxId,0,0,0); if(mr != MMSYSERR_NOERROR) { printf("Error 00: %08X/n",mr); getch(); return; } //获取线路信息 mxl.cbStruct = sizeof(MIXERLINE); mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; mr = mixerGetLineInfo((HMIXEROBJ)hMixer,&mxl,MIXER_GETLINEINFOF_COMPONENTTYPE|MIXER_OBJECTF_HMIXER); if(mr != MMSYSERR_NOERROR) if(mr != MMSYSERR_NOERROR) { printf("Error 01: %08X/n",mr); getch(); return; } // mxlc.cbStruct = sizeof(MIXERLINECONTROLS); mxlc.dwLineID = mxl.dwLineID; mxlc.cControls = mxl.cControls; mxlc.cbmxctrl = sizeof(MIXERCONTROL); mxlc.pamxctrl = (LPMIXERCONTROL)&mxc; mr = mixerGetLineControls((HMIXEROBJ)hMixer,&mxlc,MIXER_GETLINECONTROLSF_ALL|MIXER_OBJECTF_HMIXER); if(mr != MMSYSERR_NOERROR) { printf("Error 02: %08X/n",mr); getch(); return; } //获取音量 mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS); mxcd.dwControlID = mxc.dwControlID; mxcd.cChannels = MIXERCONTROL_CONTROLF_UNIFORM; //统一控制多个声道 mxcd.cMultipleItems =mxc.cMultipleItems; mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED); mxcd.paDetails = &mxcd_u; mr = mixerGetControlDetails((HMIXEROBJ)hMixer,&mxcd,MIXER_GETCONTROLDETAILSF_VALUE|MIXER_OBJECTF_HMIXER); if(mr != MMSYSERR_NOERROR) { printf("Error 03: %08X/n",mr); getch(); return; } printf("当前音量:/t%d/n",mxcd_u.dwValue); //设置音量 printf("请输入新的音量:"); scanf("%d",&mxcd_u.dwValue); mr = mixerSetControlDetails((HMIXEROBJ)hMixer,&mxcd,MIXER_GETCONTROLDETAILSF_VALUE|MIXER_OBJECTF_HMIXER); if(mr != MMSYSERR_NOERROR) { printf("Error 04: %08X/n",mr); getch(); return; } //释放设备句柄 mr = mixerClose(hMixer); if(mr != MMSYSERR_NOERROR) { printf("Error 05: %08X/n",mr); getch(); return; }}
Win7版:
参考资料:
http://msdn.microsoft.com/en-us/library/dd370892(v=VS.85).aspx
http://www.cnblogs.com/gingerjws/archive/2010/10/28/1863560.html
http://audacity.googlecode.com/svn-history/r10708/audacity-src/vendor/portaudio-v19/current/src/hostapi/wasapi/mingw-include/mmdeviceapi.h
http://www.portaudio.com/docs/v19-doxydocs/endpointvolume_8h-source.html
.386
.model flat,stdcall
option casemap:none
include e:/masm32/include/windows.inc
include e:/masm32/include/kernel32.inc
includelib e:/masm32/lib/kernel32.lib
include e:/masm32/include/user32.inc
includelib e:/masm32/lib/user32.lib
include e:/masm32/include/ole32.inc
includelib e:/masm32/lib/ole32.lib
eRender equ 0
eConsole equ 0
.data?
lpEnumerator dd ?
lpDevice dd ?
lpAudioEndpointVolume dd ?
fLevel dd ?
bMute db ?
szBuffer db 32 dup (?)
.data
;CLSID_MMDeviceEnumerator = {BCDE0395-E52F-467C-8E3D-C4579291692E}
;IID_IMMDeviceEnumerator = {A95664D2-9614-4F35-A746-DE8DB63617E6}
;IID_IAudioEndpointVolume = {5CDF2C82-841E-4546-9722-0CF74078229A}
CLSID_MMDeviceEnumerator GUID <0BCDE0395h,0E52Fh,467Ch,<8Eh,3Dh,0C4h,57h,92h,91h,69h,2Eh>>
IID_IMMDeviceEnumerator GUID <0A95664D2h,9614h,4F35h,<0A7h,46h,0DEh,8Dh,0B6h,36h,17h,0E6h>>
IID_IAudioEndpointVolume GUID <5CDF2C82h,841Eh,4546h,<97h,22h,0Ch,0F7h,40h,78h,22h,9Ah>>
.code
_MsgBoxHex proc uses ebx edi esi,_dwInt
local @szBuffer[9]:byte
local @szFormat[5]:byte
push eax
mov @szFormat[0],'%'
mov @szFormat[1],'0'
mov @szFormat[2],'8'
mov @szFormat[3],'X'
mov @szFormat[4],0
invoke wsprintf,addr @szBuffer,addr @szFormat,_dwInt
invoke MessageBox,NULL,addr @szBuffer,addr @szFormat,MB_OK
pop eax
ret
_MsgBoxHex endp
start:
invoke CoInitialize,NULL
invoke CoCreateInstance,offset CLSID_MMDeviceEnumerator,NULL,/
CLSCTX_INPROC_SERVER,offset IID_IMMDeviceEnumerator,/
offset lpEnumerator
;Enumerator.GetDefaultAudioEndpoint方法
mov esi,lpEnumerator
mov esi,[esi]
push offset lpDevice
push eConsole
push eRender
push lpEnumerator
call dword ptr [esi+16]
;Device.Activate方法
mov esi,lpDevice
mov esi,[esi]
push offset lpAudioEndpointVolume
push NULL
push CLSCTX_ALL
push offset IID_IAudioEndpointVolume
push lpDevice
call dword ptr [esi+12]
;AudioEndpointVolume.GetMasterVolumeLevelScalar方法,获取音量大小
mov esi,lpAudioEndpointVolume
mov esi,[esi]
push offset fLevel
push lpAudioEndpointVolume
call dword ptr [esi+36]
;显示fLevelDB在内存中的浮点型数据
invoke _MsgBoxHex,fLevel
;此处将令fLevel为3F333333h,即0.7
mov fLevel,3F333333h
;AudioEndpointVolume.SetMasterVolumeLevelScalar方法,设置音量大小,设置范围0~1
mov esi,lpAudioEndpointVolume
mov esi,[esi]
push NULL
push fLevel
push lpAudioEndpointVolume
call dword ptr [esi+28]
;AudioEndpointVolume.GetMute方法,获取静音状态
;mov esi,lpAudioEndpointVolume
;mov esi,[esi]
;push offset bMute
;push lpAudioEndpointVolume
;call dword ptr [esi+60]
;AudioEndpointVolume.SetMute方法,更改静音状态
;mov esi,lpAudioEndpointVolume
;mov esi,[esi]
;push NULL
;not bMute
;movzx eax,bMute
;push eax
;push lpAudioEndpointVolume
;call dword ptr [esi+56]
;Release方法
mov esi,lpAudioEndpointVolume
mov esi,[esi]
push lpAudioEndpointVolume
call dword ptr [esi+8]
mov esi,lpDevice
mov esi,[esi]
push lpDevice
call dword ptr [esi+8]
mov esi,lpEnumerator
mov esi,[esi]
push lpEnumerator
call dword ptr [esi+8]
invoke CoUninitialize
invoke ExitProcess,NULL
end start
相关文章推荐
- <Windows系统>使用C/C++语言控制7.1声道音量源代码
- iOS 系统音量控制
- C# 控制Windows系统音量
- Android 系统音量控制
- 9款优秀的开源版本控制和源代码管理系统
- iOS开发 - 滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)
- 控制windows系统音量
- iOS系统音量控制——MPVolumeView
- 恢复系统托盘上的喇叭图标(音量控制)
- 知识库系统源代码——控制层servlet代码
- Android中自定义SeekBar来控制音量,并与系统音量键的操作保持同步
- 9款优秀的开源版本控制和源代码管理系统 转载
- 【转】Vista下系统音量控制(VC版)
- 系统启动没有声音,音量控制图标不能正常显示,但realplayer能正常播放
- 系统音量控制 sndvol32.exe
- 用C# 控制Windows系统音量的实现方法
- Android系统的音量控制
- c# 系统音量的控制
- iOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)
- vc 系统音量控制详解