以下代码的作用是控制当前程序的声音,并将其他程序的声音关闭。

代码如下:

[cpp] view plain copy

  1. BOOL SetCurrentProcessVolume(DWORD dwVolume,BOOL IsMixer/*TRUE*/)
  2. {
  3. HRESULT hr <span style="white-space:pre">                 </span>= S_OK;
  4. IMMDeviceCollection *pMultiDevice       = NULL;
  5. IMMDevice *pDevice              = NULL;
  6. IAudioSessionEnumerator *pSessionEnum       = NULL;
  7. IAudioSessionManager2 *pASManager       = NULL;
  8. IMMDeviceEnumerator *m_pEnumerator      = NULL;
  9. const IID IID_ISimpleAudioVolume        = __uuidof(ISimpleAudioVolume);
  10. const IID IID_IAudioSessionControl2     = __uuidof(IAudioSessionControl2);
  11. CoInitialize(NULL);
  12. hr = CoCreateGuid(&m_guidMyContext);
  13. if(FAILED(hr))
  14. return FALSE;
  15. // Get enumerator for audio endpoint devices.
  16. hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
  17. NULL, CLSCTX_ALL,
  18. __uuidof(IMMDeviceEnumerator),
  19. (void**)&m_pEnumerator);
  20. if(FAILED(hr))
  21. return FALSE;
  22. if (IsMixer)
  23. {
  24. hr = m_pEnumerator->EnumAudioEndpoints(eRender,DEVICE_STATE_ACTIVE, &pMultiDevice);
  25. }
  26. else
  27. {
  28. hr = m_pEnumerator->EnumAudioEndpoints(eCapture,DEVICE_STATE_ACTIVE, &pMultiDevice);
  29. }
  30. if(FAILED(hr))
  31. return FALSE;
  32. UINT deviceCount = 0;
  33. hr = pMultiDevice->GetCount(&deviceCount);
  34. if(FAILED(hr))
  35. return FALSE;
  36. if((int)dwVolume < 0)
  37. dwVolume = 0;
  38. if((int)dwVolume > 100)
  39. dwVolume = 100;
  40. for (UINT ii=0; ii<deviceCount; ii++)
  41. {
  42. pDevice = NULL;
  43. hr = pMultiDevice->Item(ii,&pDevice);
  44. if(FAILED(hr))
  45. return FALSE;
  46. hr = pDevice->Activate(__uuidof(IAudioSessionManager),CLSCTX_ALL, NULL,(void**)&pASManager);
  47. if(FAILED(hr))
  48. return FALSE;
  49. hr = pASManager->GetSessionEnumerator(&pSessionEnum);
  50. if(FAILED(hr))
  51. return FALSE;
  52. int nCount;
  53. hr = pSessionEnum->GetCount(&nCount);
  54. for (int i = 0; i < nCount; i++)
  55. {
  56. IAudioSessionControl *pSessionCtrl;
  57. hr = pSessionEnum->GetSession(i, &pSessionCtrl);
  58. if (FAILED(hr))
  59. continue;
  60. IAudioSessionControl2 *pSessionCtrl2;
  61. hr = pSessionCtrl->QueryInterface(IID_IAudioSessionControl2, (void **)&pSessionCtrl2);
  62. if(FAILED(hr))
  63. continue;
  64. ULONG pid;
  65. hr = pSessionCtrl2->GetProcessId(&pid);
  66. if (FAILED(hr))
  67. continue;
  68. ISimpleAudioVolume *pSimplevol;
  69. hr = pSessionCtrl2->QueryInterface(IID_ISimpleAudioVolume, (void **)&pSimplevol);
  70. if (FAILED(hr))
  71. continue;
  72. if (pid == GetCurrentProcessId())
  73. {
  74. pSimplevol->SetMasterVolume((float)dwVolume/100, NULL);
  75. }
  76. else
  77. {
  78. pSimplevol->SetMasterVolume((float)0/100, NULL);
  79. }
  80. }
  81. }
  82. SAFE_RELEASE(m_pEnumerator);
  83. return TRUE;
  84. }

说明:

1.IMMDeviceEnumerator::EnumAudioEndpoints

EnumAudioEndpoints 方法用于生成符合指定标准的终端设备的一个合集。

第一个参数为枚举值,包括以下三个:

eRender:音频渲染流,从应用程序到设备终端的流。设置为eRender,获取播放设备。

eCapture:音频捕捉流,从设备终端到应用程序的流。设置为eCapture,获取录音设备。

eAll:获取以上两种。

第二个参数也是枚举值,包括以下几个:

DEVICE_STATE_ACTIVE:当前激活的设备

DEVICE_STATE_DISABLED:当前禁用的设备

DEVICE_STATE_NOTPRESENT:不存在的终端设备,即已经中系统中删除的设备,或者在设备管理器中禁用的设备。

DEVICE_STATE_UNPLUGGED:未插电的设备。

第三个参数,指向设备集合对象的接口。

2.用GetCount函数获取设备总数量

3.用Item函数索引单个设备。

4.用获取到的设备指针,激活应用程序音量管理指针。

Activate函数

第一个参数:设备标示符。是对GUID的一个引用,标示请求激活的接口。调用者将使用这个接口与COM对象通信。

第二个参数:用于管理将要执行的对象,可以将多个枚举值相或来设置,也可以使用CLSCTX_ALL,可以通过指定CLSCTX_ALL避免上下文的限制。

第三个参数:当用来激活设备的IAudioClient、IAudioEndpointVolume IAudioMeterInformation IAudioSessionManager或IDeviceTopology这些接口时,设置为NULL。

第四个参数:指向指定接口参数地址的指针。

5.用GetSessionEnumerator获取IAudioSessionEnumerator指针。其中包含了所有应用程序音量的控制指针。同样可以用GetCount来获取到总数。

6.用GetSession获取IAudioSessionControl指针。以上文的Item函数相似。

7.用QueryInterface通过IAudioSessionControl指针查询到IAudioSessionControl2指针,根据第一个参数设置的IID的值去查询相应的指针。

8.获取到该应用程序的PID

9.用QueryInterface获取音量控制指针

10.如果当前应用程序的PID与IAudioSessionControl2指针获取到的PID相等,则设备当前应用程序的音量。自然,也可以指定PID来控制特定应用程序的音量。

win7音频 audio service调节单个程序音量控制相关推荐

  1. Windows 7单个程序音量控制

    以下代码的作用是控制当前程序的声音,并将其他程序的声音关闭. 代码如下: BOOL SetCurrentProcessVolume(DWORD dwVolume,BOOL IsMixer/*TRUE* ...

  2. c语言m62429音量控制程序,音量控制M62446的驱动C程序

    音量控制M62446的驱动C程序音量控制M62446m62446 pdf //------------------------------------------------------------- ...

  3. android 声卡 音量控制,android audio 音量调节

    这次的分析是从setting设置开始,进入声音设置,然后进入音量设置! 先上传上来,后期进行整理吧 调用流程: -------------------------------------------- ...

  4. 【Linux】Linux 怎么调节音频的扬声器和麦克风的音量

    Linux 怎么调节音频的扬声器和麦克风的音量 Linux一般有alsamixer和amixer两个命令 alsamixer带有界面调节功能 而amixer可以通过命令进行设置从而达到调节 按F2 系 ...

  5. android音频系统(4):AudioService之音量管理

    前言:AudioService这个系统服务包含或者使用了几乎所有与音频有关的内容,AudioService是音频系统在java层的大本营: android音频系统,分为两个部分:数据流和策略: 数据流 ...

  6. android音量界面,android 音量调节以及媒体音量界面

    播放音乐类软件,用户在调节音量的时候,弹出系统的媒体音量界面,与项目的设计风格格格不入. 于是,调节音量,同时显示自己定义的媒体音量界面很有必要. 1)调整音乐音量 private AudioMana ...

  7. win7 系统下实现音量控制

    win7对audio做了改进,除了有总音量控制, 每个程序又有自己的音量控制.通常XP下控制音量的函数只能控制自己的音量而无法控制主音量.(比如函数 :mixerGetLineInfo .mixerG ...

  8. Android9 framework 按键音调用流程及自定义按键音(替换原生按键音)和调节按键音音量的方法

    一.按键音调用流程 摘要:按键音播放的总体逻辑是先找到系统中按键音的资源,然后调用SoundPool.load让系统加载音频资源,加载成功后在onLoadComplete回调中会返回一个非0的soun ...

  9. Nubia Z5S官方4.4 UI2.0音频Audio部分简单分析(也适用于其它8974/8064机型)以及降低破音出现几率的方法...

    转载请注明出处和网址链接: http://blog.csdn.net/syhost/article/details/31419749 此篇本是在Z5S的官方4.4内測版出来时写的, 主要是看到其在au ...

最新文章

  1. Netflix 官方技术博客:个性化分发与推荐,走在前列的 Netflix 是怎么做的?
  2. linux 信号灯超时时间到,急!!信号灯超时时间已到错误又出来了!!!!
  3. Centos MySql基础
  4. 2021-08-10 HDFS Web报错Couldn‘t preview the file.
  5. Rsync、Inotify-tools简介
  6. 呼叫转移流程分析(一)
  7. 电磁铁轭铁和极头收缩角
  8. FlowNet 2.0的阅读笔记
  9. android手机之-------64位操作系统 与 64位处理器
  10. 磁盘smart错误日志重点关注信息
  11. 启用Win11原生支持的DoH(DNS over HTTPS)和配置自定义的DoH服务
  12. 实战 | flink sql 实时 TopN
  13. 华炎魔方平台基本分析
  14. 现场直击汶川地震都江堰灾情(图)
  15. iOS对接Facebook:登录,分享,邀请,游戏排行榜功能
  16. 通联支付“当面付”有哪些优势?
  17. 莱宝真空泵品牌中国华东区一级授权
  18. 我的世界服务器给个人修改前缀,我的世界怎么给名字添加前后缀_给玩家添加名字前后缀方法介绍_3DM网游...
  19. 软件工程 瀑布模型、原型模型、喷泉模型和V模型的优缺点及适用场景
  20. jarjar:方便的java打包工具

热门文章

  1. C语言的feof函数
  2. 线性表的顺序存储结构
  3. 23.centos中文字体安装--2013-06-04
  4. 2022网络安全新气象
  5. 自然语言处理:文本相似度计算(欧氏距离、余弦相似度、编辑距离、杰卡德相似度)
  6. 【Ruby on Rails全栈课程】3.5 注册功能
  7. SpringBoot场景启动器(starter)原理及实践
  8. 特权级转移之 高,低特权级互相转移,模拟操作系统内核态与用户态切换以及应用程序调用系统资源
  9. 微信公众号小程序第三方获取授权流程
  10. 麦塔APP全新升级,众多新增板块,开启元宇宙新格局