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

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

#include <windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
#include <audioclient.h> //参数:
// -2 恢复静音
// -1 静音
// 0~100:音量比例
bool SetVolumeLevel(int level)
{
HRESULT hr;
IMMDeviceEnumerator* pDeviceEnumerator=;
IMMDevice* pDevice=;
IAudioEndpointVolume* pAudioEndpointVolume=;
IAudioClient* pAudioClient=; try{
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),NULL,CLSCTX_ALL,__uuidof(IMMDeviceEnumerator),(void**)&pDeviceEnumerator);
if(FAILED(hr)) throw "CoCreateInstance";
hr = pDeviceEnumerator->GetDefaultAudioEndpoint(eRender,eMultimedia,&pDevice);
if(FAILED(hr)) throw "GetDefaultAudioEndpoint";
hr = pDevice->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_ALL,NULL,(void**)&pAudioEndpointVolume);
if(FAILED(hr)) throw "pDevice->Active";
hr = pDevice->Activate(__uuidof(IAudioClient),CLSCTX_ALL,NULL,(void**)&pAudioClient);
if(FAILED(hr)) throw "pDevice->Active"; if(level==-){
hr = pAudioEndpointVolume->SetMute(FALSE,NULL);
if(FAILED(hr)) throw "SetMute";
}else if(level==-){
hr = pAudioEndpointVolume->SetMute(TRUE,NULL);
if(FAILED(hr)) throw "SetMute";
}else{
if(level< || level>){
hr = E_INVALIDARG;
throw "Invalid Arg";
} float fVolume;
fVolume = level/100.0f;
hr = pAudioEndpointVolume->SetMasterVolumeLevelScalar(fVolume,&GUID_NULL);
if(FAILED(hr)) throw "SetMasterVolumeLevelScalar"; pAudioClient->Release();
pAudioEndpointVolume->Release();
pDevice->Release();
pDeviceEnumerator->Release();
return true;
}
}
catch(...){
if(pAudioClient) pAudioClient->Release();
if(pAudioEndpointVolume) pAudioEndpointVolume->Release();
if(pDevice) pDevice->Release();
if(pDeviceEnumerator) pDeviceEnumerator->Release();
throw;
}
return false;
} int main()
{
CoInitialize();
try{
//3秒后静音
Sleep();
SetVolumeLevel(-);
//3秒后恢复静音
Sleep();
SetVolumeLevel(-);
//调节音量
Sleep();
SetVolumeLevel();
Sleep();
SetVolumeLevel();
Sleep();
SetVolumeLevel();
}
catch(...){
//错误处理...
}
CoUninitialize();
return ;
}

下载: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. NFS服务自动搭建及挂载脚本

    一.写脚本的动机 由于最近老是搭建NFS,虽然不复杂,但是很繁琐.安装服务.修改配置文件.手动挂载.写入开机自动挂载等于是就写了一个脚本 二.脚本说明及审明 作用:该脚本主要实现NFS自动安装,客户端 ...

  2. python全栈开发day17-常用模块collections,random,time,os,sys,序列化(json pickle shelve)

    1.昨日内容回顾 1.正则表达式     # 正则表达式 —— str           # 检测字符串是否符合要求     # 从大段的文字中找到符合要求的内容 1).元字符 #. # 匹配除换行 ...

  3. 017 在SecureCRT中安装rz小工具

    1.安装yum 2.上传本地的文件进虚拟机 3.注意点 只是属于SecureCRT的命令,同时,在上传的位置是现在所在的位置 4.测试

  4. Python 手动新建 Scrapy项目

    # 创建项目 scrapy startproject 工程名 # 创建爬虫 scrapy genspider example example.com

  5. [OpenCV-Python] OpenCV 中的图像处理 部分 IV (六)

    部分 IVOpenCV 中的图像处理 OpenCV-Python 中文教程(搬运)目录 23 图像变换 23.1 傅里叶变换目标本小节我们将要学习: • 使用 OpenCV 对图像进行傅里叶变换 • ...

  6. Running multiple commands in one line in shell

      You are using | (pipe) to direct the output of a command into another command. What you are lookin ...

  7. Java中十个常见的违规编码

    摘要:作者Veera Sundar在清理代码工作时发现一些常见的违规编码,因此,Veera Sundar把针对常见的一些违规编码总结成一份列表,以便帮助Java爱好者提高代码的质量和可维护性. 最近, ...

  8. CF 1131 E. String Multiplication

    E. String Multiplication 题意 分析: 从后往前考虑字符串变成什么样子. 设$S_i = p_1 \cdot p_2 \dots p_{i}$,最后一定是$S_{n - 1} ...

  9. 10.29 正睿停课训练 Day11

    目录 2018.10.29 正睿停课训练 Day11 A 线段树什么的最讨厌了(思路 DFS) B 已经没有什么好害怕的了(差分 前缀和) C 我才不是萝莉控呢(DP 贪心 哈夫曼树) 考试代码 A ...

  10. python3基础之文件对象操作

    1.向文本文件中写入内容 s = 'Hello world\n文本文件的读取方法\n文本文件的写入方法\n' # 需要写入文件的字符串 print('显示需要写入的内容:\n{0:s}'.format ...