不得不说, 自Win7(好像是吧), Windows的音量调节功能比以前更人性化了....
     但编程接口却变得更加复杂了............. 还要用到IAudioEndpointVolume………….

下面的代码是我整理的, 经测试可用, 嫌麻烦的可以直接拿来用, 接口很简单, 因而只能整个系统的音量...

  1. #include <windows.h>
  2. #include <mmdeviceapi.h>
  3. #include <endpointvolume.h>
  4. #include <audioclient.h>
  5.  
  6. //参数:
  7. // -2 恢复静音
  8. // -1 静音
  9. // 0~100:音量比例
  10. bool SetVolumeLevel(int level)
  11. {
  12. HRESULT hr;
  13. IMMDeviceEnumerator* pDeviceEnumerator=;
  14. IMMDevice* pDevice=;
  15. IAudioEndpointVolume* pAudioEndpointVolume=;
  16. IAudioClient* pAudioClient=;
  17.  
  18. try{
  19. hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),NULL,CLSCTX_ALL,__uuidof(IMMDeviceEnumerator),(void**)&pDeviceEnumerator);
  20. if(FAILED(hr)) throw "CoCreateInstance";
  21. hr = pDeviceEnumerator->GetDefaultAudioEndpoint(eRender,eMultimedia,&pDevice);
  22. if(FAILED(hr)) throw "GetDefaultAudioEndpoint";
  23. hr = pDevice->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_ALL,NULL,(void**)&pAudioEndpointVolume);
  24. if(FAILED(hr)) throw "pDevice->Active";
  25. hr = pDevice->Activate(__uuidof(IAudioClient),CLSCTX_ALL,NULL,(void**)&pAudioClient);
  26. if(FAILED(hr)) throw "pDevice->Active";
  27.  
  28. if(level==-){
  29. hr = pAudioEndpointVolume->SetMute(FALSE,NULL);
  30. if(FAILED(hr)) throw "SetMute";
  31. }else if(level==-){
  32. hr = pAudioEndpointVolume->SetMute(TRUE,NULL);
  33. if(FAILED(hr)) throw "SetMute";
  34. }else{
  35. if(level< || level>){
  36. hr = E_INVALIDARG;
  37. throw "Invalid Arg";
  38. }
  39.  
  40. float fVolume;
  41. fVolume = level/100.0f;
  42. hr = pAudioEndpointVolume->SetMasterVolumeLevelScalar(fVolume,&GUID_NULL);
  43. if(FAILED(hr)) throw "SetMasterVolumeLevelScalar";
  44.  
  45. pAudioClient->Release();
  46. pAudioEndpointVolume->Release();
  47. pDevice->Release();
  48. pDeviceEnumerator->Release();
  49. return true;
  50. }
  51. }
  52. catch(...){
  53. if(pAudioClient) pAudioClient->Release();
  54. if(pAudioEndpointVolume) pAudioEndpointVolume->Release();
  55. if(pDevice) pDevice->Release();
  56. if(pDeviceEnumerator) pDeviceEnumerator->Release();
  57. throw;
  58. }
  59. return false;
  60. }
  61.  
  62. int main()
  63. {
  64. CoInitialize();
  65. try{
  66. //3秒后静音
  67. Sleep();
  68. SetVolumeLevel(-);
  69. //3秒后恢复静音
  70. Sleep();
  71. SetVolumeLevel(-);
  72. //调节音量
  73. Sleep();
  74. SetVolumeLevel();
  75. Sleep();
  76. SetVolumeLevel();
  77. Sleep();
  78. SetVolumeLevel();
  79. }
  80. catch(...){
  81. //错误处理...
  82. }
  83. CoUninitialize();
  84. return ;
  85. }

下载:http://share.weiyun.com/19003dc8fd0804aaf1fc03b2430e832e

参考:
              IAudioEndpointVolume interface

Win7/Vista Audio API Master Volume Control

女孩不哭 @ cnblogs.com/memset @ 2014-04-07

编程调节Win7/Win8系统音量的一种方法的更多相关文章

  1. Tomcat 在win7/win8 系统下tomcat-users.xml.new(拒绝访问)解决方法

    tomcat启动报错No UserDatabase component found under key UserDatabase 也可以这样处理 Tomcat 在win7/win8 系统下tomcat ...

  2. WIN7(VISTA)系统无法上网问题排查方法

    WIN7(VISTA)系统无法上网问题排查方法 一.无法通过DHCP自动获取到IP 1. 确认正确配置路由器的DHCP功能 a.一般租期建议设置为1-3小时,推荐设置1小时. b.DHCP地址池不要和 ...

  3. WPF编程,C#中对话框自动关闭的一种方法。

    原文:WPF编程,C#中对话框自动关闭的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/8 ...

  4. 解决安装包在win7,win8系统下安装后运行没有管理员权限

    今天打包一个程序在客户机上安装运行:一直报没有管理员权限:客户机是win8系统:直接右键管理员身份运行则都可以:为了避免不让用户每次都这么麻烦:只有问哈群友和百度,终于找到解决方法: 第一步:项目属性 ...

  5. Live帐号登陆win8系统不用输密码的方法

    win 8 系统旨在让大家日常的操作更加方便与快捷.因此,今天,小编将与大家分享的是如何利用Live帐号登陆win8系统,而不用输密码的方法.具体的步骤如下文所述. 按win+R打开运行输入cmd(在 ...

  6. C51编程中对单片机绝对地址访问的两种方法

    在进行8051单片机应用系统程序设计时,编程都往往少不了要直接操作系统的各个存储器地址空间.C51程序经过编译之后产生的目标代码具有浮动地址,其绝对地址必须经过BL51连接定位后才能确定.为了能够在C ...

  7. python多进程编程中常常能用到的几种方法

    python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU资源,在python中大部分情况需要使用多进程.python提供了非常好用的多进程包Multiprocessing,只需要定义 ...

  8. Win7/Win8 系统下安装Oracle 10g 提示“程序异常终止,发生未知错误”的解决方法

    我的Oracle 10g版本是10.2.0.1.0,(10.1同理)选择高级安装,提示“程序异常终止,发生未知错误”. 1.修改Oracle 10G\database\stage\prereq\db\ ...

  9. Mac 系统重新安装的几种方法

    转:https://blog.csdn.net/feibozhulang/article/details/43734109 苹果官网说明: https://support.apple.com/en-u ...

随机推荐

  1. VS2010发布、打包安装程序(超全超详细)

    1. 在vs2010 选择“新建项目”→“ 其他项目类型”→“ Visual Studio Installer→“安装项目”: 命名为:Setup1 . 这是在VS2010中将有三个文件夹, 1.“应 ...

  2. Scala入门教程---《chang哥教你一天搞定Scala》

    <chang哥教你一天搞定Scala> /** * <chang哥教你一天搞定Scala> * scala是一门多范式编程语言,集成了面向对象编程和函数式编程等多种特性. * ...

  3. HDU 3746 Cyclic Nacklace (KMP求循环节问题)

    <题目链接> 题目大意: 给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数. [>>>kmp next函数 kmp的周期问题]  #include &l ...

  4. 暴力破解工具hydra与Medusa

    ---恢复内容开始--- 暴力破解工具hydra与Medusa 内容 (一)hadry (二)Medusa (一)hydra 选项 -l LOGIN 指定破解的用户名称,对特定用户破解. -L FIL ...

  5. 【Java并发核心三】CountDownLatch、CyclicBarrier及Phaser

    个人感觉,看书学习还是需要“不求甚解”,因为一旦太过于计较小的得失,就容易钻牛角尖,学习进度也慢.我们完全可以先学一个大概,等到真正用到的时候再把那些细节丰富起来,就更有针对性. 所以,针对java并 ...

  6. Django 学习第二天——URL路由及模板渲染方式

    URL 的概念及格式: URL的引入:客户端:知道了url 就可以去进行访问: 服务端:设置好了url,别人才能访问到我 URL :网址(全球统一资源定位符):由 协议,域名(ip port) ,路径 ...

  7. MySQL数据库-----基本命令操作

    小编之前一直想要了解一下,如何搭建数据库,这里分享一下在此之前的一些准备工作,首先小编是先了解数据库(mysql),以下是小编的一些认识: 一.mysql常用命令1.mysql登录和退出 登录:mys ...

  8. PHP函数 ------ ctype_alnum

    //判断是否是字母和数字或字母数字的组合 if(!ctype_alnum($str)){ echo '只能是字母或数字的组合';exit; }整理下ctype functions: 1.ctype_a ...

  9. android studio 中去除应用标题栏

    android studio 中去除应用标题栏 ㈠ ⒈ mainifests中设置: android:theme="@style/AppTheme"(即默认设置). ⒉ value ...

  10. C# 不同类型对象同名属性赋值

    /// <summary> /// 不同类型对象同名属性赋值 /// </summary> /// <typeparam name="S">源类 ...