您的位置:首页 > 编程语言 > C语言/C++

Win7系统下C++实现客户端程序单独静音功能

2012-10-09 17:03 483 查看
  本文主要是作为学习笔记而编写的,同时也希望能帮助需要的人!!

  实现这个功能是为了解决公司浏览器中Win7下不能静音的BUG。搜索了很多网页,都没有找到这方面的实现!但我心里很清楚,一定是有方法解决这个问题的。所以,在心情还算良好的情况下,静下心来查看MSDN的英文介绍,果然让我找到了这个!Core Audio API——Win7系统以后才有的。而该库的相关中文介绍,可以参考以下文章:

1. http://caicaioffice.blog.163.com/blog/static/1417910220094154269427/

2.http://caicaioffice.blog.163.com/blog/static/14179102200941542637752/

  通过看上面的文章,虽然能够实现设备音量的控制,但貌似还是木有针对一个程序来控制其静音,所以,只能靠MSDN帮忙了!

  要实现客户端程序真正的单独静音,我们必须考虑以下两点:

  1. 从客户端程序设置单独静音

  提到客户端程序音量控制,首先就需要获取程序IAudioSessionManager会话(Session)。然后再通过调用会话对应的ISimpleAudioVolume中的SetMute函数,就可以设置客户端程序是否静音了。整个代码都先给出:

  在TxMuted.h文件中的代码:

View Code

#include "stdafx.h"
#include "MutedSessionEvent.h"

extern volatile bool g_bMuted;

CMutedSessionEvents::CMutedSessionEvents(IAudioSessionManager*    pAudioSessionManager)
{
m_AudioSessionManager = pAudioSessionManager;
_cRef = 1;
}

ULONG STDMETHODCALLTYPE CMutedSessionEvents::Release()
{
ULONG ulRef = InterlockedDecrement(&_cRef);
if (0 == ulRef)
{
delete this;
}
return ulRef;
}

HRESULT STDMETHODCALLTYPE CMutedSessionEvents::QueryInterface(
REFIID  riid,
VOID  **ppvInterface)
{
if (IID_IUnknown == riid)
{
AddRef();
*ppvInterface = (IUnknown*)this;
}
else if (__uuidof(IAudioSessionEvents) == riid)
{
AddRef();
*ppvInterface = (IAudioSessionEvents*)this;
}
else
{
*ppvInterface = NULL;
return E_NOINTERFACE;
}
return S_OK;
}

HRESULT STDMETHODCALLTYPE CMutedSessionEvents::OnSimpleVolumeChanged(
float NewVolume,
BOOL NewMute,
LPCGUID EventContext)
{
// 防止其它程序对静音篡改
if ((BOOL)g_bMuted != NewMute)
{
TxSetMuted(g_bMuted);
}

return S_OK;
}

bool CMutedSessionEvents::TxSetMuted(bool bMuted)
{
HRESULT hr = S_FALSE;

// 获得音量、静音控制接口
ISimpleAudioVolume   *pAudioVolume = NULL;
hr = m_AudioSessionManager->GetSimpleAudioVolume(NULL,0,&pAudioVolume);
if (FAILED(hr)) return false;

if(SUCCEEDED(hr))
{
pAudioVolume->SetMute(bMuted, &GUID_NULL);

// 更改全局静音状态
g_bMuted = bMuted;
}

if (pAudioVolume != NULL)
{
pAudioVolume->Release();
pAudioVolume = NULL;
}
return true;
}


  好啦!以上代码为本人亲测后的代码,可以使用的!如果有什么问题,欢迎来指出~~ 请勿拍砖!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: