编程调节Win7/Win8系统音量的一种方法
不得不说, 自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系统音量的一种方法的更多相关文章
- Tomcat 在win7/win8 系统下tomcat-users.xml.new(拒绝访问)解决方法
tomcat启动报错No UserDatabase component found under key UserDatabase 也可以这样处理 Tomcat 在win7/win8 系统下tomcat ...
- WIN7(VISTA)系统无法上网问题排查方法
WIN7(VISTA)系统无法上网问题排查方法 一.无法通过DHCP自动获取到IP 1. 确认正确配置路由器的DHCP功能 a.一般租期建议设置为1-3小时,推荐设置1小时. b.DHCP地址池不要和 ...
- WPF编程,C#中对话框自动关闭的一种方法。
原文:WPF编程,C#中对话框自动关闭的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/8 ...
- 解决安装包在win7,win8系统下安装后运行没有管理员权限
今天打包一个程序在客户机上安装运行:一直报没有管理员权限:客户机是win8系统:直接右键管理员身份运行则都可以:为了避免不让用户每次都这么麻烦:只有问哈群友和百度,终于找到解决方法: 第一步:项目属性 ...
- Live帐号登陆win8系统不用输密码的方法
win 8 系统旨在让大家日常的操作更加方便与快捷.因此,今天,小编将与大家分享的是如何利用Live帐号登陆win8系统,而不用输密码的方法.具体的步骤如下文所述. 按win+R打开运行输入cmd(在 ...
- C51编程中对单片机绝对地址访问的两种方法
在进行8051单片机应用系统程序设计时,编程都往往少不了要直接操作系统的各个存储器地址空间.C51程序经过编译之后产生的目标代码具有浮动地址,其绝对地址必须经过BL51连接定位后才能确定.为了能够在C ...
- python多进程编程中常常能用到的几种方法
python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU资源,在python中大部分情况需要使用多进程.python提供了非常好用的多进程包Multiprocessing,只需要定义 ...
- Win7/Win8 系统下安装Oracle 10g 提示“程序异常终止,发生未知错误”的解决方法
我的Oracle 10g版本是10.2.0.1.0,(10.1同理)选择高级安装,提示“程序异常终止,发生未知错误”. 1.修改Oracle 10G\database\stage\prereq\db\ ...
- Mac 系统重新安装的几种方法
转:https://blog.csdn.net/feibozhulang/article/details/43734109 苹果官网说明: https://support.apple.com/en-u ...
随机推荐
- VS2010发布、打包安装程序(超全超详细)
1. 在vs2010 选择“新建项目”→“ 其他项目类型”→“ Visual Studio Installer→“安装项目”: 命名为:Setup1 . 这是在VS2010中将有三个文件夹, 1.“应 ...
- Scala入门教程---《chang哥教你一天搞定Scala》
<chang哥教你一天搞定Scala> /** * <chang哥教你一天搞定Scala> * scala是一门多范式编程语言,集成了面向对象编程和函数式编程等多种特性. * ...
- HDU 3746 Cyclic Nacklace (KMP求循环节问题)
<题目链接> 题目大意: 给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数. [>>>kmp next函数 kmp的周期问题] #include &l ...
- 暴力破解工具hydra与Medusa
---恢复内容开始--- 暴力破解工具hydra与Medusa 内容 (一)hadry (二)Medusa (一)hydra 选项 -l LOGIN 指定破解的用户名称,对特定用户破解. -L FIL ...
- 【Java并发核心三】CountDownLatch、CyclicBarrier及Phaser
个人感觉,看书学习还是需要“不求甚解”,因为一旦太过于计较小的得失,就容易钻牛角尖,学习进度也慢.我们完全可以先学一个大概,等到真正用到的时候再把那些细节丰富起来,就更有针对性. 所以,针对java并 ...
- Django 学习第二天——URL路由及模板渲染方式
URL 的概念及格式: URL的引入:客户端:知道了url 就可以去进行访问: 服务端:设置好了url,别人才能访问到我 URL :网址(全球统一资源定位符):由 协议,域名(ip port) ,路径 ...
- MySQL数据库-----基本命令操作
小编之前一直想要了解一下,如何搭建数据库,这里分享一下在此之前的一些准备工作,首先小编是先了解数据库(mysql),以下是小编的一些认识: 一.mysql常用命令1.mysql登录和退出 登录:mys ...
- PHP函数 ------ ctype_alnum
//判断是否是字母和数字或字母数字的组合 if(!ctype_alnum($str)){ echo '只能是字母或数字的组合';exit; }整理下ctype functions: 1.ctype_a ...
- android studio 中去除应用标题栏
android studio 中去除应用标题栏 ㈠ ⒈ mainifests中设置: android:theme="@style/AppTheme"(即默认设置). ⒉ value ...
- C# 不同类型对象同名属性赋值
/// <summary> /// 不同类型对象同名属性赋值 /// </summary> /// <typeparam name="S">源类 ...