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;
}
本人新手,为了实现这个功能,找了好久资料. 顶一下又不会怀孕,幸苦了 直接用API不行吗? liwey 发表于 2016-11-1 09:50
直接用API不行吗?
新手不太懂,原来一直搞单片机,找了好久资料{:dizzy:} win7本身系统的音量 太小了 幸苦 顶一个 还是顶一下,辛苦了 简单而快速的实现音量控制,通过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) 看楼主写的QT程序很难受{:sweat:} 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:}
CH_anyin 发表于 2016-11-22 15:16
大神请教个问题:
我在QT用QAxObject调用一个OLE automation接口
用object->dynamicCall方式调用无参,或设 ...
大神可不敢当, 你有没有生成文档看一下, 就是把 generateDocumentation 的输出保存成一个html 文件, 按照文档调用就可以了. 调参数调用肯定是可以的. daat 发表于 2016-11-1 16:22
看楼主写的QT程序很难受
除了 #include <QAxBase> 这行和qt有点关系之外, 就和 qt 没有一点关系了. 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 CH_anyin 发表于 2016-11-22 16:22
我用generateDocumentation导出看过了,也用dumpcpp导出了.cpp和.h文件
html里面是这样描述的
能把 generateDocumentation 生成的完整 html 文件发一下吗? 能把控件一块传上来就更好了 liwey 发表于 2016-11-22 16:58
能把 generateDocumentation 生成的完整 html 文件发一下吗? 能把控件一块传上来就更好了 ...
接口及描述文件全部在这里 最近打算学一下qt,发现讨论的人真不多。 liwey 发表于 2016-11-22 16:58
能把 generateDocumentation 生成的完整 html 文件发一下吗? 能把控件一块传上来就更好了 ...
这个接口是视频播放软件Stereoscopic Player的 javenreal 发表于 2016-11-22 21:56
最近打算学一下qt,发现讨论的人真不多。
这里是电子论坛哦, 你还指望什么, 现在qt的资料是真的不少了. CH_anyin 发表于 2016-11-23 08:56
这个接口是视频播放软件Stereoscopic Player的
一会我装上看一眼, 安装上这个控件就自动注册上的吗? 还是需要手动注册的. liwey 发表于 2016-11-23 09:42
一会我装上看一眼, 安装上这个控件就自动注册上的吗? 还是需要手动注册的. ...
自动注册的 本帖最后由 liwey 于 2016-11-23 12:16 编辑
CH_anyin 发表于 2016-11-23 09:59
自动注册的
临下班试了下, 是可以获取音量的, 吃完饭上传代码和图
[编辑] 补充图和代码:
太感谢了,本来就是没事试一下的,本来看起来很简单的结果怎么搞都不行,试了好久,然后感觉不把它搞定心里就是各种不爽{:dizzy:} CH_anyin 发表于 2016-11-23 12:15
太感谢了,本来就是没事试一下的,本来看起来很简单的结果怎么搞都不行,试了好久,然后感觉不把它搞定心里就是 ...
已经编辑到楼上了 liwey 发表于 2016-11-23 12:17
已经编辑到楼上了
找到原因了,是我这播放器文件版本低,又不是官网下的,有些问题,在官网下了新的重新安装一下就可以了.
页:
[1]