Qt 实现Windows系统Win10 c++音量调节
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++音量调节相关推荐
- Windows系统win10系统磁力种子文件下载软件推荐
描述:Windows系统win10系统磁力种子文件下载软件推荐 名称: 比特彗星
- Windows系统win10系统流程图软件推荐
描述:Windows系统win10系统流程图软件推荐 名称: drawio
- Windows系统win10系统看图pdf阅读器软件推荐
描述:Windows系统win10系统看图pdf阅读器软件推荐 名称 : 看图王
- Windows系统win10系统日历日程管理软件推荐
描述:Windows系统win10系统日历日程管理软件推荐 名称: 云日历
- windows系统win10系统文件批量重命名软件名称
描述:windows系统win10系统文件批量重命名软件名称 名称: 超级文件批量重命名工具
- Pango+Qt 列举windows系统字体
欢迎关注公众号可以查看更多完整文章 可以显示Windows上所安装的所有字体的名称. 使用Qt显示数量和名称. 需要依赖Pango.Cairo.glib三个库,获取三个库,获取可以参见我的其他博客. ...
- 获取与设置windows系统下音频设备音量
一.获取设备音量 不同系统获取音量的方法是有差别的,比如vista和win7获取音量的方式就是不同的,因此,我们应该首先获取系统的信息,然后根据系统信息,用其对应的方法获取音量. 1.OSVERSIO ...
- Qt 控制 Windows 系统触摸键盘显示隐藏,自定义添加可编辑控件
前言 最近在做触摸屏的一款软件,需要使用 Windows 的触摸键盘控制,费了不少功夫,查了网上很多资料,终于搞定了.现在贴出来代码,以期帮助更多的人. 头文件 #ifndef KEYBOARDMGR ...
- windows系统win10使用curl命令模拟发送post/get请求
请求地址 http://10.120.22.123:9527/payment/lb?userName=4 POST请求 curl -d '[参数]' [请求地址] eg: curl -d 'userN ...
- linux系统 系统推荐 deepin国产系统 最好用的国产linux系统 Windows系统的优秀替代品 deepin系统安装 系统安装 deepin
前言: 我用过多款linux系统,电脑上装的是Ubuntu和deepin,服务器端用的是centos,还用过优麒麟等.黑苹果也用了一段时间.现在linux系统已经发展的比较完善,内核及其图形界面也很稳 ...
最新文章
- 【机器学习】梯度提升树(GBDT)的原理小结
- 粤港澳大湾区菜篮子-哲商对话·林裕豪:从玉农业谋定标准
- 【学习笔记】分析函数(开窗函数)
- 互补输出级采用共集形式是为了使_天津大学胡文平《先进材料》:溶液法制备厘米级高度取向有机晶体阵列,可用于高性能有机场效应晶体管...
- Springboot 项目中过滤器的使用
- 2021年度抖音小红书美妆行业营销报告
- CAN笔记(6) CAN协议(一)
- zuul 自定义路由映射规则
- Angularjs-项目搭建
- 对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。...
- VC6.0 Dialog 如何添加 WM_ERASEBACKGROUND 消息
- STM32WL开发之LORA产品选型
- vue源码解析-实现
- 修改Android模拟器存储位置
- 千寻位置平台使用入门总结
- 滞回比较器 万字形状
- 神经网络正则化java_聊聊神经网络中的正则化
- QPST download crash内存
- Unix哲学学习笔记
- 黑胶唱片的“另类”用途
热门文章
- [2018.10.23 T3] 新的家园
- 华为手机投屏电脑_手机投屏干货分享:华为如何投屏到电视机?
- opa847方波放大电路_我现在用lm358做了一个放大3倍的放大电路,输出大概3~4v,要带负载50Ω。带150的时候没事,但50就波形消失...
- System与Runtime类
- python中await async_asyncio中的async和await
- 解决:“/****/kafka_2.13-3.0.0/bin/kafka-run-class.sh: line 342: exec: java: not found ”问题
- Java对象引用之“强引用、软引用、弱引用、虚引用”
- Git(4):提交代码时忽略不必要的文件或文件夹
- vue.js--基础 数据的双向绑定
- 文件过滤器FileFilter