一直想控制系统音量,但是似乎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#] 控制系统音量-第一章相关推荐

  1. [C#] 控制系统音量-第二章

    ======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 网站:www. ...

  2. 自动控制原理 第一章 控制系统的一般概念

    第一章 控制系统的一般概念 1.1 控制系统的基本原理 自动控制定义:自动控制(automatic control)是指在没有人直接参与的情况下,利用外加的设备或装置,使机器.设备或生产过程的某个工作 ...

  3. 发电机计算机控制系统的组成,第一章发动机电控系统概述

    <第一章发动机电控系统概述>由会员分享,可在线阅读,更多相关<第一章发动机电控系统概述(28页珍藏版)>请在人人文库网上搜索. 1.2021-6-23 广东轻院汽车广东轻院汽车 ...

  4. 第一章 汽车电子控制系统

    #AUTOSAR规范与车用控制器软件开发 第一章 汽车电子控制系统 文章目录 前言 一.汽车电子的应用范围 1.动力传动总成电子系统 2.底盘电子系统 3.车身电子系统 4.汽车通信与娱乐电子系统 二 ...

  5. 人工智能:第一章 绪 论

    第一章 绪 论 教学内容:本章首先介绍人工智能的定义.发展概况及相关学派和他们的认知观,接着讨论人工智能的研究和应用领域,最后简介本书的主要内容和编排. 教学重点: 1.从不同科学或学科出发对人工智能 ...

  6. 微型计算机与裸机,第一章 微型计算机基础

    考点一.理解微处理器.微型计算机和微型计算机系统的概念及其相互关系. 1.1微信计算机系统组成 微型计算机是指以微处理器为核心,配上存储器,输入/输出接口电路等所组成的计算机. 微型计算机系统是指以微 ...

  7. 计算机基础第一章知识题库,题库第一章计算机基础知识

    题库第一章计算机基础知识 (51页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 23.9 积分 第一章 计算机基础知识一.判断正误题1.第二计算机的主存采 ...

  8. 《机器人学导论--Join J.Craig》第一章 绪论

    <机器人学导论–Join J.Craig>第一章 绪论 1.1 背景 1. 机器人取代人:人工成本原来越高,工业机器人的成本越来越低,且无需人工那些福利.待遇等,属于一本万利.随着工业机器 ...

  9. 《使用IEC61499为控制系统建模》-第一章 概述

    译者的话 也许和IEC61499 标准还不够普及有关,关于IEC61499 标准的书籍并不多,Alois Zoitl & Robert Lewis 二位合著的这本书是网络上论文中被引用最多的一 ...

  10. 【王道考研】操作系统 笔记 第一章

    特此鸣谢王道考研 本文参考王道考研的相关课程 若有侵权请联系,立删 其余笔记链接: [王道考研]操作系统笔记 第一章_才疏学浅743的博客-CSDN博客 [王道考研]操作系统 笔记 第二章上 进程调度 ...

最新文章

  1. 机智云官网用到的库-grid.css我解析
  2. 曙光i620c20用户手册_曙光天阔I620-G20服务器技术白皮书.pdf
  3. 关于PostgreSQL的GiST索引之四
  4. 使用RMAN VALIDATE验证数据和备份
  5. Git LFS的使用
  6. 请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止。
  7. ssis导入xml_SSIS包中的XML任务概述
  8. Android Arcface人脸识别sdk使用工具类
  9. UIDatePicker 显示时间和打印时间不一样
  10. 浙大开源lidar_imu_calib源码安装过程
  11. 学习软件测试有哪些优势?
  12. 如何更改windows桌面图标,更改桌面图标方法
  13. 微信小程序腾讯地图控制 4G Cat.1模组 ,安信可CA-01加载定位显示当前位置。
  14. 【基金研究】《公募权益类基金投资者盈利洞察报告》
  15. 国产海洋地球物理设备简述----侧扫声纳
  16. ubuntu和windows之间实现复制粘贴
  17. 旁注、目录越权、跨库、CDN绕过
  18. 入坑esp-01s 1.3寸OLED带农历时钟及天气显示(四)
  19. 我的世界java版怎么选择版本_《我的世界》游戏版本太多,玩家该如何选择?听听老玩家怎么说...
  20. 微信小程序—自定义(城市选择)弹窗组件,将弹窗组件的值传给调用页面并显示(图文)

热门文章

  1. 【带权并查集详解】以HDU 3038为例【How Many Answers Are Wrong】
  2. 20.有效的括号(力扣leetcode) 博主可答疑该问题
  3. Linux进程优先级取值范围,Linux中使用nice和renice命令:改变进程优先级
  4. originos是鸿蒙系统吗,originos系统是安卓吗
  5. STM32中assert_param的使用
  6. Shell脚本 小程序演示
  7. xcode 9.0 iOS 11
  8. java doc、docx、pdf格式互转
  9. JAVA继承类初始化顺序
  10. 【Hoxton.SR1版本】Spring Cloud Bus消息总线