搜索
bottom↓
回复: 23

QT windows 7 调整系统主音量方法,给需要的人

[复制链接]

出0入0汤圆

发表于 2016-10-31 23:11:13 | 显示全部楼层 |阅读模式

需要在.pro文件中加 QT       += axcontainer

#include <mmdeviceapi.h>
#include <endpointvolume.h>
#include <audioclient.h>
//#include <combaseapi.h>
//#include <ks.h>
#include <QAxBase>


bool MainWindow::SetVolumeLevel(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;
}

本人新手,为了实现这个功能,找了好久资料.

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-11-1 07:38:32 来自手机 | 显示全部楼层
顶一下又不会怀孕,幸苦了

出0入0汤圆

发表于 2016-11-1 09:50:40 | 显示全部楼层
直接用API不行吗?

出0入0汤圆

 楼主| 发表于 2016-11-1 10:18:59 | 显示全部楼层
liwey 发表于 2016-11-1 09:50
直接用API不行吗?

新手不太懂,原来一直搞单片机,找了好久资料

出0入8汤圆

发表于 2016-11-1 10:20:29 | 显示全部楼层
win7  本身系统的音量 太小了

出0入0汤圆

发表于 2016-11-1 10:53:45 | 显示全部楼层
幸苦 顶一个

出0入0汤圆

发表于 2016-11-1 10:57:19 | 显示全部楼层
还是顶一下,辛苦了

出0入0汤圆

 楼主| 发表于 2016-11-1 13:07:07 | 显示全部楼层
简单而快速的实现音量控制,通过WIndows API的键盘发送函数

/*音量加*/
keybd_event (0xAF, 0, 0, 0);
keybd_event (0xAF, 0, KEYEVENTF_KEYUP, 0)

/*音量减*/
keybd_event (0xAE, 0, 0, 0);
keybd_event (0xAE, 0, KEYEVENTF_KEYUP, 0)

/*静音切换*/
keybd_event (0xAD, 0, 0, 0);
keybd_event (0xAD, 0, KEYEVENTF_KEYUP, 0)

出0入0汤圆

发表于 2016-11-1 16:22:39 | 显示全部楼层
看楼主写的QT程序很难受

出0入0汤圆

 楼主| 发表于 2016-11-22 15:16:10 | 显示全部楼层
liwey 发表于 2016-11-1 09:50
直接用API不行吗?

大神请教个问题:
我在QT用QAxObject调用一个OLE automation接口
用object->dynamicCall方式调用无参,或设置参数方法都正常,如
  1. QAxObject *object = new QAxObject(this);
  2. object->setControl("Player.Automation");
  3. object->dynamicCall("ClosePlayer()");//void ClosePlayer()
  4. object->dynamicCall("SetVolume(1)");//void SetVolume([In] double volume)
复制代码

但调用返回参数的方法就怎么都获取不到数据,如
  1. double volume;
  2. object->dynamicCall("GetVolume(double&)",volume);//void GetVolume(out double volume);
复制代码

搞了好久都不行,感觉脑子进入死循环了,强烈的被虐待

出0入0汤圆

发表于 2016-11-22 15:24:10 | 显示全部楼层
CH_anyin 发表于 2016-11-22 15:16
大神请教个问题:
我在QT用QAxObject调用一个OLE automation接口
用object->dynamicCall方式调用无参,或设 ...

大神可不敢当, 你有没有生成文档看一下, 就是把 generateDocumentation 的输出保存成一个html 文件, 按照文档调用就可以了. 调参数调用肯定是可以的.

出0入0汤圆

发表于 2016-11-22 15:26:48 | 显示全部楼层
daat 发表于 2016-11-1 16:22
看楼主写的QT程序很难受

除了 #include <QAxBase> 这行和qt有点关系之外, 就和 qt 没有一点关系了.

出0入0汤圆

 楼主| 发表于 2016-11-22 16:22:08 | 显示全部楼层
liwey 发表于 2016-11-22 15:24
大神可不敢当, 你有没有生成文档看一下, 就是把 generateDocumentation 的输出保存成一个html 文件, 按照 ...

我用generateDocumentation导出看过了,也用dumpcpp导出了.cpp和.h文件
html里面是这样描述的
  1. ......
  2. Public Slots:
  3. void GetVolume(QVariant& Volume);
  4. -------------------------------------------------------------------------------------------------------------------------------
  5. Member Function Documentation

  6. void GetVolume (QVariant& Volume) [slot]
  7. Connect a signal to this slot:
  8. QObject::connect(sender, SIGNAL(someSignal(QVariant&)), object, SLOT(GetVolume(QVariant&)));
  9. Or call the function directly:
  10. QVariantList params = ...
  11. object->dynamicCall("GetVolume(QVariant&)", params);
  12. ......
复制代码


我这样写的
  1. QVariant volume;
  2. object->DoSomething();//OK
  3. object->SetVolume(0.5);//OK
  4. object->GetVolume(volume);//报错,QAxBase: Error calling IDispatch member GetVolume: Unknown error
  5. object->GetVolume(&volume);//报错error: 'QVariant::QVariant(void*)' is private inline QVariant(void *) Q_DECL_EQ_DELETE;

  6. QVariantList params;
  7. object->dynamicCall("GetVolume(QVariant&)", params);//报错,QAxBase: Error calling IDispatch member GetVolume: Unknown error
复制代码

出0入0汤圆

发表于 2016-11-22 16:58:09 | 显示全部楼层
CH_anyin 发表于 2016-11-22 16:22
我用generateDocumentation导出看过了,也用dumpcpp导出了.cpp和.h文件
html里面是这样描述的


能把 generateDocumentation 生成的完整 html 文件发一下吗? 能把控件一块传上来就更好了

出0入0汤圆

 楼主| 发表于 2016-11-22 17:26:39 | 显示全部楼层
liwey 发表于 2016-11-22 16:58
能把 generateDocumentation 生成的完整 html 文件发一下吗? 能把控件一块传上来就更好了 ...

接口及描述文件全部在这里

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-11-22 21:56:21 来自手机 | 显示全部楼层
最近打算学一下qt,发现讨论的人真不多。

出0入0汤圆

 楼主| 发表于 2016-11-23 08:56:23 | 显示全部楼层
liwey 发表于 2016-11-22 16:58
能把 generateDocumentation 生成的完整 html 文件发一下吗? 能把控件一块传上来就更好了 ...

这个接口是视频播放软件Stereoscopic Player的

出0入0汤圆

发表于 2016-11-23 09:41:52 | 显示全部楼层
javenreal 发表于 2016-11-22 21:56
最近打算学一下qt,发现讨论的人真不多。

这里是电子论坛哦, 你还指望什么, 现在qt的资料是真的不少了.

出0入0汤圆

发表于 2016-11-23 09:42:43 | 显示全部楼层
CH_anyin 发表于 2016-11-23 08:56
这个接口是视频播放软件Stereoscopic Player的

一会我装上看一眼, 安装上这个控件就自动注册上的吗? 还是需要手动注册的.

出0入0汤圆

 楼主| 发表于 2016-11-23 09:59:34 | 显示全部楼层
liwey 发表于 2016-11-23 09:42
一会我装上看一眼, 安装上这个控件就自动注册上的吗? 还是需要手动注册的. ...

自动注册的

出0入0汤圆

发表于 2016-11-23 11:52:28 | 显示全部楼层
本帖最后由 liwey 于 2016-11-23 12:16 编辑

临下班试了下, 是可以获取音量的, 吃完饭上传代码和图

[编辑] 补充图和代码:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2016-11-23 12:15:34 | 显示全部楼层
太感谢了,本来就是没事试一下的,本来看起来很简单的结果怎么搞都不行,试了好久,然后感觉不把它搞定心里就是各种不爽

出0入0汤圆

发表于 2016-11-23 12:17:12 | 显示全部楼层
CH_anyin 发表于 2016-11-23 12:15
太感谢了,本来就是没事试一下的,本来看起来很简单的结果怎么搞都不行,试了好久,然后感觉不把它搞定心里就是 ...

已经编辑到楼上了

出0入0汤圆

 楼主| 发表于 2016-11-23 12:59:55 | 显示全部楼层
liwey 发表于 2016-11-23 12:17
已经编辑到楼上了

找到原因了,是我这播放器文件版本低,又不是官网下的,有些问题,在官网下了新的重新安装一下就可以了.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 20:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表