win7系统音量的监控,使用IAudioEndpointVolume接口,该如何解决
win7系统音量的监控,使用IAudioEndpointVolume接口
小弟第一次使用WIN API借口,完全不会啊,请各位大大支个招,很多小白问题,请多多包涵。
(发到C++ builder的API版块两天了没人看,所以转移过来了)
程序使用C++ builder 2010和WIN7系统,只需要监控系统音量的变化然后用一个音量控件直接显示就行了。
在网上查了些资料,是说要用到IAudioEndpointVolume接口,然后用IAudioEndpointVolume::RegisterControlChangeNotify来注册一个监控对象,该函数需要一个IAudioEndpointVolumeCallback接口来接受信息,但是这个接口好像要自己写个类继承?(不知道自己理解对了吗),于是我就照搬网上的例子(例子:http://msdn.microsoft.com/en-us/library/bb331828.aspx),代码如下,但是有几个地方不太懂:
然后是使用这个接口的函数,也是照搬网上:
运行之后没有出现OnNotify函数中的ShowMessage,调试时出现了内存访问的错误:access violation at 0x752ac9f1: read of address 0x00000000,不知道应该修改哪里?
在这之前我先测试了IAudioEndpointVolume接口获取和改变系统音量的函数,一切正常,然后在写监控的函数,但是就是无法监控到系统音量变化,小弟第一次发帖,分不多,跪求大大们指导一下。
------解决思路----------------------
http://www.baigoogledu.com/s.php?hl=zh-CN&q=IAudioEndpointVolumeCallback
------解决思路----------------------
建议楼主还是多看看C++的基础书籍,比如C++primer,再就是稍微了解一下C++的组件模型,这些懂了,这个程序就简单了。。。
小弟第一次使用WIN API借口,完全不会啊,请各位大大支个招,很多小白问题,请多多包涵。
(发到C++ builder的API版块两天了没人看,所以转移过来了)
程序使用C++ builder 2010和WIN7系统,只需要监控系统音量的变化然后用一个音量控件直接显示就行了。
在网上查了些资料,是说要用到IAudioEndpointVolume接口,然后用IAudioEndpointVolume::RegisterControlChangeNotify来注册一个监控对象,该函数需要一个IAudioEndpointVolumeCallback接口来接受信息,但是这个接口好像要自己写个类继承?(不知道自己理解对了吗),于是我就照搬网上的例子(例子:http://msdn.microsoft.com/en-us/library/bb331828.aspx),代码如下,但是有几个地方不太懂:
class CVolumeNotification : public IAudioEndpointVolumeCallback
{
LONG m_RefCount; //这个变量是什么作用?
public:
CVolumeNotification(void) : m_RefCount(1)
{
}
~CVolumeNotification(void) {}
STDMETHODIMP_(ULONG)AddRef() { return InterlockedIncrement(&m_RefCount); }
STDMETHODIMP_(ULONG)Release()
{
LONG ref = InterlockedDecrement(&m_RefCount);
if (ref == 0)
delete this;
return ref;
}
STDMETHODIMP QueryInterface(REFIID IID, void **ReturnValue) //这个函数也不知道有什么作用?
{
if (IID == IID_IUnknown || IID== __uuidof(IAudioEndpointVolumeCallback))
{
*ReturnValue = static_cast<IUnknown*>(this);
AddRef();
return S_OK;
}
*ReturnValue = NULL;
return E_NOINTERFACE;
return S_OK;
}
//看网上说这个函数用来监控音量变化的,但我始终无法监控到系统音量变化
STDMETHODIMP OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA NotificationData)
{
ShowMessage("notify");
return S_OK;
}
};
然后是使用这个接口的函数,也是照搬网上:
bool TForm1::GetVolumeLevel()
{
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";
CVolumeNotification pVolumeNotification;
pAudioEndpointVolume->RegisterControlChangeNotify((IAudioEndpointVolumeCallback*)&pVolumeNotification);
//因为要测试是否监控到了音量变化,所以下面几个释放的函数先注释了。
// 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;
}
}
运行之后没有出现OnNotify函数中的ShowMessage,调试时出现了内存访问的错误:access violation at 0x752ac9f1: read of address 0x00000000,不知道应该修改哪里?
在这之前我先测试了IAudioEndpointVolume接口获取和改变系统音量的函数,一切正常,然后在写监控的函数,但是就是无法监控到系统音量变化,小弟第一次发帖,分不多,跪求大大们指导一下。
------解决思路----------------------
http://www.baigoogledu.com/s.php?hl=zh-CN&q=IAudioEndpointVolumeCallback
------解决思路----------------------
建议楼主还是多看看C++的基础书籍,比如C++primer,再就是稍微了解一下C++的组件模型,这些懂了,这个程序就简单了。。。