1.简述

Qt原生是不支持系统音量调节的,需要用到windows的API,效果如下

2.代码

测试代码

    QSlider *pSliderValume = new QSlider(this);pSliderValume->setValue(sysVolume());  //CWindows.hconnect(pSliderValume,&QSlider::sigValueChanged,[=](int nVal){setSysVolume(nVal); //CWindows.h});/*监听系统音量变化*/QTimer *pTimerListenVolume = new QTimer(this);pTimerListenVolume->start(100);connect(pTimerListenVolume,&QTimer::timeout,[=]{int nSysValume = sysVolume();if(pSliderValume->value() != nSysValume)pSliderValume->setValue(nSysValume);});

接口头文件

#ifdef Q_OS_WINbool setSysVolume(int level);int sysVolume();
#endif //Q_OS_WIN

接口源文件

#ifdef Q_OS_WIN
#include <windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
#include <audioclient.h>//参数:
//  -2 恢复静音
//  -1 静音
//  0~100:音量比例
bool setSysVolume(int level)
{HRESULT hr;IMMDeviceEnumerator* pDeviceEnumerator=0;IMMDevice* pDevice=0;IAudioEndpointVolume* pAudioEndpointVolume=0;IAudioClient* pAudioClient=0;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==-2){hr = pAudioEndpointVolume->SetMute(FALSE,NULL);if(FAILED(hr)) throw "SetMute";}else if(level==-1){hr = pAudioEndpointVolume->SetMute(TRUE,NULL);if(FAILED(hr)) throw "SetMute";}else{if(level<0 || level>100){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 sysVolume()
{HRESULT hr;IMMDeviceEnumerator* pDeviceEnumerator=0;IMMDevice* pDevice=0;IAudioEndpointVolume* pAudioEndpointVolume=0;IAudioClient* pAudioClient=0;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";float fVolume;hr = pAudioEndpointVolume->GetMasterVolumeLevelScalar(&fVolume);if(FAILED(hr)) throw "SetMasterVolumeLevelScalar";pAudioClient->Release();pAudioEndpointVolume->Release();pDevice->Release();pDeviceEnumerator->Release();int  intVolume = fVolume*100+1;if(fVolume>100){fVolume =100;}return intVolume;}catch(...){if(pAudioClient) pAudioClient->Release();if(pAudioEndpointVolume) pAudioEndpointVolume->Release();if(pDevice) pDevice->Release();if(pDeviceEnumerator) pDeviceEnumerator->Release();throw;}
}
#endif

Qt 实现Windows系统Win10 c++音量调节相关推荐

  1. Windows系统win10系统磁力种子文件下载软件推荐

    描述:Windows系统win10系统磁力种子文件下载软件推荐 名称: 比特彗星

  2. Windows系统win10系统流程图软件推荐

    描述:Windows系统win10系统流程图软件推荐 名称: drawio

  3. Windows系统win10系统看图pdf阅读器软件推荐

    描述:Windows系统win10系统看图pdf阅读器软件推荐 名称 : 看图王

  4. Windows系统win10系统日历日程管理软件推荐

    描述:Windows系统win10系统日历日程管理软件推荐 名称: 云日历

  5. windows系统win10系统文件批量重命名软件名称

    描述:windows系统win10系统文件批量重命名软件名称 名称: 超级文件批量重命名工具

  6. Pango+Qt 列举windows系统字体

    欢迎关注公众号可以查看更多完整文章 可以显示Windows上所安装的所有字体的名称. 使用Qt显示数量和名称. 需要依赖Pango.Cairo.glib三个库,获取三个库,获取可以参见我的其他博客. ...

  7. 获取与设置windows系统下音频设备音量

    一.获取设备音量 不同系统获取音量的方法是有差别的,比如vista和win7获取音量的方式就是不同的,因此,我们应该首先获取系统的信息,然后根据系统信息,用其对应的方法获取音量. 1.OSVERSIO ...

  8. Qt 控制 Windows 系统触摸键盘显示隐藏,自定义添加可编辑控件

    前言 最近在做触摸屏的一款软件,需要使用 Windows 的触摸键盘控制,费了不少功夫,查了网上很多资料,终于搞定了.现在贴出来代码,以期帮助更多的人. 头文件 #ifndef KEYBOARDMGR ...

  9. windows系统win10使用curl命令模拟发送post/get请求

    请求地址 http://10.120.22.123:9527/payment/lb?userName=4 POST请求 curl -d '[参数]' [请求地址] eg: curl -d 'userN ...

  10. linux系统 系统推荐 deepin国产系统 最好用的国产linux系统 Windows系统的优秀替代品 deepin系统安装 系统安装 deepin

    前言: 我用过多款linux系统,电脑上装的是Ubuntu和deepin,服务器端用的是centos,还用过优麒麟等.黑苹果也用了一段时间.现在linux系统已经发展的比较完善,内核及其图形界面也很稳 ...

最新文章

  1. 【机器学习】梯度提升树(GBDT)的原理小结
  2. 粤港澳大湾区菜篮子-哲商对话·林裕豪:从玉农业谋定标准
  3. 【学习笔记】分析函数(开窗函数)
  4. 互补输出级采用共集形式是为了使_天津大学胡文平《先进材料》:溶液法制备厘米级高度取向有机晶体阵列,可用于高性能有机场效应晶体管...
  5. Springboot 项目中过滤器的使用
  6. 2021年度抖音小红书美妆行业营销报告
  7. CAN笔记(6) CAN协议(一)
  8. zuul 自定义路由映射规则
  9. Angularjs-项目搭建
  10. 对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。...
  11. VC6.0 Dialog 如何添加 WM_ERASEBACKGROUND 消息
  12. STM32WL开发之LORA产品选型
  13. vue源码解析-实现
  14. 修改Android模拟器存储位置
  15. 千寻位置平台使用入门总结
  16. 滞回比较器 万字形状
  17. 神经网络正则化java_聊聊神经网络中的正则化
  18. QPST download crash内存
  19. Unix哲学学习笔记
  20. 黑胶唱片的“另类”用途

热门文章

  1. [2018.10.23 T3] 新的家园
  2. 华为手机投屏电脑_手机投屏干货分享:华为如何投屏到电视机?
  3. opa847方波放大电路_我现在用lm358做了一个放大3倍的放大电路,输出大概3~4v,要带负载50Ω。带150的时候没事,但50就波形消失...
  4. System与Runtime类
  5. python中await async_asyncio中的async和await
  6. 解决:“/****/kafka_2.13-3.0.0/bin/kafka-run-class.sh: line 342: exec: java: not found ”问题
  7. Java对象引用之“强引用、软引用、弱引用、虚引用”
  8. Git(4):提交代码时忽略不必要的文件或文件夹
  9. vue.js--基础 数据的双向绑定
  10. 文件过滤器FileFilter