[C#] 控制系统音量-第一章
一直想控制系统音量,但是似乎C#都有着很多的问题,索性去看API。
最后找到了一个外国友人的东西,外国友人写的类就是好看,感觉比自己写的要规范好多啊!
自己使用了此类后发现了一个问题,在XP系统下正常,但是Win7以上都不能正常使用。
然后又查了一下官方的解释,原来微软win7后就改动了底层的音量控制的东西。
现在贴出来,希望大家对大家有帮助,在后面将讲解在Win7及其以上怎么操作系统音量的问题!
class AudioMixerHelper{public const int MMSYSERR_NOERROR = 0;public const int MAXPNAMELEN = 32;public const int MIXER_LONG_NAME_CHARS = 64;public const int MIXER_SHORT_NAME_CHARS = 16;public const int MIXER_GETLINEINFOF_COMPONENTTYPE = 0x3;public const int MIXER_GETCONTROLDETAILSF_VALUE = 0x0;public const int MIXER_GETLINECONTROLSF_ONEBYTYPE = 0x2;public const int MIXER_SETCONTROLDETAILSF_VALUE = 0x0;public const int MIXERLINE_COMPONENTTYPE_DST_FIRST = 0x0;public const int MIXERLINE_COMPONENTTYPE_SRC_FIRST = 0x1000;public const int MIXERLINE_COMPONENTTYPE_DST_SPEAKERS =(MIXERLINE_COMPONENTTYPE_DST_FIRST + 4);public const int MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE =(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3);public const int MIXERLINE_COMPONENTTYPE_SRC_LINE = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 2);public const int MIXERCONTROL_CT_CLASS_FADER = 0x50000000;public const int MIXERCONTROL_CT_UNITS_UNSIGNED = 0x30000;public const int MIXERCONTROL_CONTROLTYPE_FADER = (MIXERCONTROL_CT_CLASS_FADER | MIXERCONTROL_CT_UNITS_UNSIGNED);public const int MIXERCONTROL_CONTROLTYPE_VOLUME = (MIXERCONTROL_CONTROLTYPE_FADER + 1);[DllImport("winmm.dll", CharSet=CharSet.Ansi)]private static extern int mixerClose (int hmx);[DllImport("winmm.dll", CharSet=CharSet.Ansi)]private static extern int mixerGetControlDetailsA (int hmxobj,refMIXERCONTROLDETAILS pmxcd , int fdwDetails);[DllImport("winmm.dll", CharSet=CharSet.Ansi)]private static extern int mixerGetDevCapsA(int uMxId, MIXERCAPS pmxcaps, int cbmxcaps);[DllImport("winmm.dll", CharSet=CharSet.Ansi)]private static extern int mixerGetID (int hmxobj, int pumxID, int fdwId);[DllImport("winmm.dll", CharSet=CharSet.Ansi)]private static extern int mixerGetLineControlsA (int hmxobj,ref MIXERLINECONTROLS pmxlc, int fdwControls);[DllImport("winmm.dll", CharSet=CharSet.Ansi)]private static extern int mixerGetLineInfoA (int hmxobj,ref MIXERLINE pmxl , int fdwInfo);[DllImport("winmm.dll", CharSet=CharSet.Ansi)]private static extern int mixerGetNumDevs();[DllImport("winmm.dll", CharSet=CharSet.Ansi)]private static extern int mixerMessage(int hmx , int uMsg , int dwParam1 , int dwParam2);[DllImport("winmm.dll", CharSet=CharSet.Ansi)]private static extern int mixerOpen (out int phmx , int uMxId ,int dwCallback , int dwInstance , int fdwOpen);[DllImport("winmm.dll", CharSet=CharSet.Ansi)]private static extern int mixerSetControlDetails(int hmxobj ,ref MIXERCONTROLDETAILS pmxcd , int fdwDetails);public struct MIXERCAPS{public int wMid;public int wPid;public int vDriverVersion;[MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAXPNAMELEN)]public string szPname;public int fdwSupport;public int cDestinations;}public struct MIXERCONTROL{public int cbStruct;public int dwControlID;public int dwControlType;public int fdwControl;public int cMultipleItems;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=MIXER_SHORT_NAME_CHARS)]public string szShortName ;[MarshalAs( UnmanagedType.ByValTStr,SizeConst=MIXER_LONG_NAME_CHARS)]public string szName;public int lMinimum;public int lMaximum;[MarshalAs(UnmanagedType.U4, SizeConst=10)]public int reserved;}public struct MIXERCONTROLDETAILS{public int cbStruct;public int dwControlID;public int cChannels;public int item;public int cbDetails;public IntPtr paDetails;}public struct MIXERCONTROLDETAILS_UNSIGNED{public int dwValue;}public struct MIXERLINE{public int cbStruct;public int dwDestination;public int dwSource;public int dwLineID;public int fdwLine;public int dwUser;public int dwComponentType;public int cChannels;public int cConnections;public int cControls;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=MIXER_SHORT_NAME_CHARS)]public string szShortName;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=MIXER_LONG_NAME_CHARS )]public string szName;public int dwType;public int dwDeviceID;public int wMid;public int wPid;public int vDriverVersion ;[MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAXPNAMELEN)]public string szPname ;}public struct MIXERLINECONTROLS{public int cbStruct;public int dwLineID;public int dwControl;public int cControls;public int cbmxctrl;public IntPtr pamxctrl;}private static bool GetVolumeControl(int hmixer, int componentType,int ctrlType, out MIXERCONTROL mxc, out int vCurrentVol){// This function attempts to obtain a mixer control.// Returns True if successful.MIXERLINECONTROLS mxlc = new MIXERLINECONTROLS();MIXERLINE mxl = new MIXERLINE();MIXERCONTROLDETAILS pmxcd = new MIXERCONTROLDETAILS();MIXERCONTROLDETAILS_UNSIGNED du = new MIXERCONTROLDETAILS_UNSIGNED();mxc = new MIXERCONTROL();int rc;bool retValue;vCurrentVol = -1;mxl.cbStruct = Marshal.SizeOf(mxl);mxl.dwComponentType = componentType;rc = mixerGetLineInfoA(hmixer,ref mxl,MIXER_GETLINEINFOF_COMPONENTTYPE );if(MMSYSERR_NOERROR == rc){int sizeofMIXERCONTROL = 152;int ctrl = Marshal.SizeOf(typeof(MIXERCONTROL));mxlc.pamxctrl = Marshal.AllocCoTaskMem(sizeofMIXERCONTROL);mxlc.cbStruct = Marshal.SizeOf(mxlc);mxlc.dwLineID = mxl.dwLineID;mxlc.dwControl = ctrlType;mxlc.cControls = 1;mxlc.cbmxctrl = sizeofMIXERCONTROL;// Allocate a buffer for the controlmxc.cbStruct = sizeofMIXERCONTROL;// Get the controlrc = mixerGetLineControlsA(hmixer,ref mxlc,MIXER_GETLINECONTROLSF_ONEBYTYPE);if(MMSYSERR_NOERROR == rc){retValue = true;// Copy the control into the destination structuremxc = (MIXERCONTROL)Marshal.PtrToStructure(mxlc.pamxctrl,typeof(MIXERCONTROL));}else{retValue = false;}int sizeofMIXERCONTROLDETAILS = Marshal.SizeOf(typeof(MIXERCONTROLDETAILS));int sizeofMIXERCONTROLDETAILS_UNSIGNED = Marshal.SizeOf(typeof(MIXERCONTROLDETAILS_UNSIGNED));pmxcd.cbStruct = sizeofMIXERCONTROLDETAILS;pmxcd.dwControlID = mxc.dwControlID;pmxcd.paDetails = Marshal.AllocCoTaskMem(sizeofMIXERCONTROLDETAILS_UNSIGNED) ;pmxcd.cChannels = 1;pmxcd.item = 0;pmxcd.cbDetails = sizeofMIXERCONTROLDETAILS_UNSIGNED;rc = mixerGetControlDetailsA(hmixer,ref pmxcd,MIXER_GETCONTROLDETAILSF_VALUE);du = (MIXERCONTROLDETAILS_UNSIGNED)Marshal.PtrToStructure(pmxcd.paDetails, typeof(MIXERCONTROLDETAILS_UNSIGNED));vCurrentVol = du.dwValue;return retValue;}retValue = false;return retValue;}private static bool SetVolumeControl(int hmixer, MIXERCONTROL mxc,int volume){// This function sets the value for a volume control.// Returns True if successfulbool retValue;int rc;MIXERCONTROLDETAILS mxcd = new MIXERCONTROLDETAILS();MIXERCONTROLDETAILS_UNSIGNED vol = new MIXERCONTROLDETAILS_UNSIGNED();mxcd.item = 0;mxcd.dwControlID = mxc.dwControlID;mxcd.cbStruct = Marshal.SizeOf(mxcd);mxcd.cbDetails = Marshal.SizeOf(vol);// Allocate a buffer for the control value buffermxcd.cChannels = 1;vol.dwValue = volume;// Copy the data into the control value buffermxcd.paDetails = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(MIXERCONTROLDETAILS_UNSIGNED)));Marshal.StructureToPtr(vol, mxcd.paDetails,false);// Set the control valuerc = mixerSetControlDetails(hmixer,ref mxcd,MIXER_SETCONTROLDETAILSF_VALUE);if(MMSYSERR_NOERROR == rc){retValue = true;}else{retValue = false;} return retValue;}public static int GetVolume(){int mixer;MIXERCONTROL volCtrl = new MIXERCONTROL();int currentVol;mixerOpen(out mixer,0 ,0 ,0, 0);int type = MIXERCONTROL_CONTROLTYPE_VOLUME;GetVolumeControl(mixer,MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,type,out volCtrl, out currentVol);mixerClose(mixer);return currentVol;}public static void SetVolume(int vVolume){int mixer;MIXERCONTROL volCtrl = new MIXERCONTROL();int currentVol;mixerOpen(out mixer,0 ,0 ,0, 0);int type = MIXERCONTROL_CONTROLTYPE_VOLUME;GetVolumeControl(mixer,MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,type,out volCtrl, out currentVol);if(vVolume > volCtrl.lMaximum) vVolume = volCtrl.lMaximum;if(vVolume < volCtrl.lMinimum) vVolume = volCtrl.lMinimum;SetVolumeControl(mixer, volCtrl, vVolume);GetVolumeControl(mixer, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,type,out volCtrl, out currentVol);if(vVolume != currentVol){throw new Exception("Cannot Set Volume");}mixerClose(mixer);}}
转载请注明出处!
[C#] 控制系统音量-第一章相关推荐
- [C#] 控制系统音量-第二章
======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 网站:www. ...
- 自动控制原理 第一章 控制系统的一般概念
第一章 控制系统的一般概念 1.1 控制系统的基本原理 自动控制定义:自动控制(automatic control)是指在没有人直接参与的情况下,利用外加的设备或装置,使机器.设备或生产过程的某个工作 ...
- 发电机计算机控制系统的组成,第一章发动机电控系统概述
<第一章发动机电控系统概述>由会员分享,可在线阅读,更多相关<第一章发动机电控系统概述(28页珍藏版)>请在人人文库网上搜索. 1.2021-6-23 广东轻院汽车广东轻院汽车 ...
- 第一章 汽车电子控制系统
#AUTOSAR规范与车用控制器软件开发 第一章 汽车电子控制系统 文章目录 前言 一.汽车电子的应用范围 1.动力传动总成电子系统 2.底盘电子系统 3.车身电子系统 4.汽车通信与娱乐电子系统 二 ...
- 人工智能:第一章 绪 论
第一章 绪 论 教学内容:本章首先介绍人工智能的定义.发展概况及相关学派和他们的认知观,接着讨论人工智能的研究和应用领域,最后简介本书的主要内容和编排. 教学重点: 1.从不同科学或学科出发对人工智能 ...
- 微型计算机与裸机,第一章 微型计算机基础
考点一.理解微处理器.微型计算机和微型计算机系统的概念及其相互关系. 1.1微信计算机系统组成 微型计算机是指以微处理器为核心,配上存储器,输入/输出接口电路等所组成的计算机. 微型计算机系统是指以微 ...
- 计算机基础第一章知识题库,题库第一章计算机基础知识
题库第一章计算机基础知识 (51页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 23.9 积分 第一章 计算机基础知识一.判断正误题1.第二计算机的主存采 ...
- 《机器人学导论--Join J.Craig》第一章 绪论
<机器人学导论–Join J.Craig>第一章 绪论 1.1 背景 1. 机器人取代人:人工成本原来越高,工业机器人的成本越来越低,且无需人工那些福利.待遇等,属于一本万利.随着工业机器 ...
- 《使用IEC61499为控制系统建模》-第一章 概述
译者的话 也许和IEC61499 标准还不够普及有关,关于IEC61499 标准的书籍并不多,Alois Zoitl & Robert Lewis 二位合著的这本书是网络上论文中被引用最多的一 ...
- 【王道考研】操作系统 笔记 第一章
特此鸣谢王道考研 本文参考王道考研的相关课程 若有侵权请联系,立删 其余笔记链接: [王道考研]操作系统笔记 第一章_才疏学浅743的博客-CSDN博客 [王道考研]操作系统 笔记 第二章上 进程调度 ...
最新文章
- 机智云官网用到的库-grid.css我解析
- 曙光i620c20用户手册_曙光天阔I620-G20服务器技术白皮书.pdf
- 关于PostgreSQL的GiST索引之四
- 使用RMAN VALIDATE验证数据和备份
- Git LFS的使用
- 请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止。
- ssis导入xml_SSIS包中的XML任务概述
- Android Arcface人脸识别sdk使用工具类
- UIDatePicker 显示时间和打印时间不一样
- 浙大开源lidar_imu_calib源码安装过程
- 学习软件测试有哪些优势?
- 如何更改windows桌面图标,更改桌面图标方法
- 微信小程序腾讯地图控制 4G Cat.1模组 ,安信可CA-01加载定位显示当前位置。
- 【基金研究】《公募权益类基金投资者盈利洞察报告》
- 国产海洋地球物理设备简述----侧扫声纳
- ubuntu和windows之间实现复制粘贴
- 旁注、目录越权、跨库、CDN绕过
- 入坑esp-01s 1.3寸OLED带农历时钟及天气显示(四)
- 我的世界java版怎么选择版本_《我的世界》游戏版本太多,玩家该如何选择?听听老玩家怎么说...
- 微信小程序—自定义(城市选择)弹窗组件,将弹窗组件的值传给调用页面并显示(图文)
热门文章
- 【带权并查集详解】以HDU 3038为例【How Many Answers Are Wrong】
- 20.有效的括号(力扣leetcode) 博主可答疑该问题
- Linux进程优先级取值范围,Linux中使用nice和renice命令:改变进程优先级
- originos是鸿蒙系统吗,originos系统是安卓吗
- STM32中assert_param的使用
- Shell脚本 小程序演示
- xcode 9.0 iOS 11
- java doc、docx、pdf格式互转
- JAVA继承类初始化顺序
- 【Hoxton.SR1版本】Spring Cloud Bus消息总线