CH_anyin 发表于 2016-10-31 23:11:13

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


需要在.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;
}

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

slan 发表于 2016-11-1 07:38:32

顶一下又不会怀孕,幸苦了

liwey 发表于 2016-11-1 09:50:40

直接用API不行吗?

CH_anyin 发表于 2016-11-1 10:18:59

liwey 发表于 2016-11-1 09:50
直接用API不行吗?

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

kebaojun305 发表于 2016-11-1 10:20:29

win7本身系统的音量 太小了

kang732816702 发表于 2016-11-1 10:53:45

幸苦 顶一个

闲鱼翻身 发表于 2016-11-1 10:57:19

还是顶一下,辛苦了

CH_anyin 发表于 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)

daat 发表于 2016-11-1 16:22:39

看楼主写的QT程序很难受{:sweat:}

CH_anyin 发表于 2016-11-22 15:16:10

liwey 发表于 2016-11-1 09:50
直接用API不行吗?

大神请教个问题:
我在QT用QAxObject调用一个OLE automation接口
用object->dynamicCall方式调用无参,或设置参数方法都正常,如
QAxObject *object = new QAxObject(this);
object->setControl("Player.Automation");
object->dynamicCall("ClosePlayer()");//void ClosePlayer()
object->dynamicCall("SetVolume(1)");//void SetVolume( double volume)
但调用返回参数的方法就怎么都获取不到数据,如
double volume;
object->dynamicCall("GetVolume(double&)",volume);//void GetVolume(out double volume);
搞了好久都不行,感觉脑子进入死循环了,强烈的被虐待{:dizzy:}

liwey 发表于 2016-11-22 15:24:10

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

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

liwey 发表于 2016-11-22 15:26:48

daat 发表于 2016-11-1 16:22
看楼主写的QT程序很难受

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

CH_anyin 发表于 2016-11-22 16:22:08

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

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

void GetVolume (QVariant& Volume)
Connect a signal to this slot:
QObject::connect(sender, SIGNAL(someSignal(QVariant&)), object, SLOT(GetVolume(QVariant&)));
Or call the function directly:
QVariantList params = ...
object->dynamicCall(\"GetVolume(QVariant&)\", params);
......

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

QVariantList params;
object->dynamicCall("GetVolume(QVariant&)", params);//报错,QAxBase: Error calling IDispatch member GetVolume: Unknown error

liwey 发表于 2016-11-22 16:58:09

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



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

CH_anyin 发表于 2016-11-22 17:26:39

liwey 发表于 2016-11-22 16:58
能把 generateDocumentation 生成的完整 html 文件发一下吗? 能把控件一块传上来就更好了 ...

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

javenreal 发表于 2016-11-22 21:56:21

最近打算学一下qt,发现讨论的人真不多。

CH_anyin 发表于 2016-11-23 08:56:23

liwey 发表于 2016-11-22 16:58
能把 generateDocumentation 生成的完整 html 文件发一下吗? 能把控件一块传上来就更好了 ...

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

liwey 发表于 2016-11-23 09:41:52

javenreal 发表于 2016-11-22 21:56
最近打算学一下qt,发现讨论的人真不多。

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

liwey 发表于 2016-11-23 09:42:43

CH_anyin 发表于 2016-11-23 08:56
这个接口是视频播放软件Stereoscopic Player的

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

CH_anyin 发表于 2016-11-23 09:59:34

liwey 发表于 2016-11-23 09:42
一会我装上看一眼, 安装上这个控件就自动注册上的吗? 还是需要手动注册的. ...

自动注册的

liwey 发表于 2016-11-23 11:52:28

本帖最后由 liwey 于 2016-11-23 12:16 编辑

CH_anyin 发表于 2016-11-23 09:59
自动注册的
临下班试了下, 是可以获取音量的, 吃完饭上传代码和图

[编辑] 补充图和代码:


CH_anyin 发表于 2016-11-23 12:15:34

太感谢了,本来就是没事试一下的,本来看起来很简单的结果怎么搞都不行,试了好久,然后感觉不把它搞定心里就是各种不爽{:dizzy:}

liwey 发表于 2016-11-23 12:17:12

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

已经编辑到楼上了

CH_anyin 发表于 2016-11-23 12:59:55

liwey 发表于 2016-11-23 12:17
已经编辑到楼上了

找到原因了,是我这播放器文件版本低,又不是官网下的,有些问题,在官网下了新的重新安装一下就可以了.
页: [1]
查看完整版本: QT windows 7 调整系统主音量方法,给需要的人