#ifdef SPEAKERDEVMUTECONTROL
# define SPEAKERDEVMUTECONTROL_EXPORT __declspec(dllexport)
#else
# define SPEAKERDEVMUTECONTROL_EXPORT __declspec(dllimport)
#endif
SPEAKERDEVMUTECONTROL_EXPORT bool setSpeakerDevName(const chConstStringA& strDevName);
SPEAKERDEVMUTECONTROL_EXPORT bool cancleSpeakerDevMute();
SPEAKERDEVMUTECONTROL_EXPORT bool returnSpeakerDevMute();

SPEAKERDEVMUTECONTROL_EXPORT int GetDevIDByName(chStringA strDevName);
SPEAKERDEVMUTECONTROL_EXPORT BOOL getSystemMuteStatusLaterWindowVista(BOOL& bMuted);
SPEAKERDEVMUTECONTROL_EXPORT BOOL setSystemMuteLaterWindowVista(BOOL bMuted = FALSE);
SPEAKERDEVMUTECONTROL_EXPORT BOOL setSystemMuteLaterWindowVistaByDevID(UINT devID, BOOL bMuted = FALSE);
SPEAKERDEVMUTECONTROL_EXPORT BOOL getSystemMuteStatusLaterWindowVistaByDevID(UINT devID, BOOL& bMuted);

//////////////////////

#include "../ETLLib/ETLLib.hpp"
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x0600
#include <Windows.h>
#include <endpointvolume.h>
#include <mmdeviceapi.h>
#include <devicetopology.h>
#include <FunctionDiscoveryKeys_devpkey.h>
#include "SpeakerDevMuteControl.h"

#define SAFE_RELEASE(punk) \
if ((punk) != NULL) \
{ (punk)->Release(); (punk) = NULL; }

#define INIT_DEFAULT_IAUDIOENDPOINT \
CoInitialize(NULL);\
hr = S_OK;\
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),\
NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator),(void**)&m_pEnumerator);\
if(SUCCEEDED(hr))\
{\
hr = m_pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &m_pDevice);\
if (SUCCEEDED(hr))\
{\
hr = m_pDevice->Activate(__uuidof(IAudioEndpointVolume),\
CLSCTX_ALL, NULL, (void**)&m_pEndptVolCtrl);\
}\
}
#define INIT_IAUDIOENDPOINT_BYID(devID) \
CoInitialize(NULL);\
hr = S_OK;\
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),\
NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator),(void**)&m_pEnumerator);\
if(SUCCEEDED(hr))\
{\
hr = m_pEnumerator->EnumAudioEndpoints(eAll, DEVICE_STATEMASK_ALL, &m_pCollection);\
if (SUCCEEDED(hr))\
{\
hr = m_pCollection->Item(devID, &m_pDevice);\
if (SUCCEEDED(hr))\
{\
hr = m_pDevice->Activate(__uuidof(IAudioEndpointVolume),\
CLSCTX_ALL, NULL, (void**)&m_pEndptVolCtrl);\
}\
}\
}

#define INIT_DEVICECOLLECTION \
CoInitialize(NULL);\
hr = S_OK;\
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),\
NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator),(void**)&m_pEnumerator);\
if(SUCCEEDED(hr))\
{\
hr = m_pEnumerator->EnumAudioEndpoints(eAll, DEVICE_STATEMASK_ALL, &m_pCollection);\
}
#define UNINIT_IAUDIOENDPPINTVOLUME \
SAFE_RELEASE(m_pEndptVolCtrl);\
SAFE_RELEASE(m_pDevice);\
SAFE_RELEASE(m_pEnumerator);\
SAFE_RELEASE(m_pCollection);\
CoUninitialize();

int GetDevIDByName(chStringA strDevName)
{
if (strDevName.empty())
{
return -1;
}
chStringW strDevNameW = chUTF82W(strDevName);
IAudioEndpointVolume *m_pEndptVolCtrl = NULL;
IMMDevice *m_pDevice = NULL;
IMMDeviceCollection *m_pCollection = NULL;
IMMDeviceEnumerator *m_pEnumerator = NULL;
HRESULT hr = S_OK;
INIT_DEVICECOLLECTION;
if (SUCCEEDED(hr))
{
UINT nDevCounts = 0;
m_pCollection->GetCount(&nDevCounts);
for (int i = 0; i < (int)nDevCounts; i++)
{
hr = m_pCollection->Item(i, &m_pDevice);
DWORD state;
m_pDevice->GetState(&state);
if (state == DEVICE_STATE_NOTPRESENT )
{
continue;
}
IPropertyStore* pRopertyStore;
hr = m_pDevice->OpenPropertyStore(STGM_READ, &pRopertyStore);
if (SUCCEEDED(hr))
{
PROPVARIANT varName;
PropVariantInit(&varName);
hr = pRopertyStore->GetValue(PKEY_Device_FriendlyName, &varName);
typedef uCTextHelper<WCHAR, false> WCI;
if (WCI::strncmp(strDevNameW.c_ptr(), varName.pwszVal, strDevNameW.length()) == 0)
{
return i;
}
}
}
}
return -1;
}
BOOL setSystemMuteLaterWindowVista(BOOL bMuted /*= FALSE*/)
{
BOOL bReresult = FALSE;
IAudioEndpointVolume *m_pEndptVolCtrl = NULL;
IMMDevice *m_pDevice = NULL;
IMMDeviceCollection *m_pCollection = NULL;
IMMDeviceEnumerator *m_pEnumerator = NULL;
HRESULT hr = S_OK;
INIT_DEFAULT_IAUDIOENDPOINT;
if (SUCCEEDED(hr))
{
hr = m_pEndptVolCtrl->SetMute(bMuted, NULL);
if (SUCCEEDED(hr))
{
bReresult = TRUE;
}
}
UNINIT_IAUDIOENDPPINTVOLUME;
return bReresult;
}

BOOL getSystemMuteStatusLaterWindowVista(BOOL& bMuted)
{
BOOL bReresult = FALSE;
IAudioEndpointVolume *m_pEndptVolCtrl = NULL;
IMMDevice *m_pDevice = NULL;
IMMDeviceCollection *m_pCollection = NULL;
IMMDeviceEnumerator *m_pEnumerator = NULL;
HRESULT hr = S_OK;
INIT_DEFAULT_IAUDIOENDPOINT;
if (SUCCEEDED(hr))
{
hr = m_pEndptVolCtrl->GetMute(&bMuted);
if (SUCCEEDED(hr))
{
bReresult = TRUE;
}
}
UNINIT_IAUDIOENDPPINTVOLUME;
return bReresult;
}

BOOL setSystemMuteLaterWindowVistaByDevID(UINT devID, BOOL bMuted /*= FALSE*/)
{
if (devID == -1)
{
return setSystemMuteLaterWindowVista(bMuted);
}

BOOL bReresult = FALSE;
IMMDeviceCollection *m_pCollection = NULL;
IMMDevice *m_pDevice = NULL;
IAudioEndpointVolume *m_pEndptVolCtrl = NULL;
IMMDeviceEnumerator *m_pEnumerator = NULL;
HRESULT hr = S_OK;
INIT_IAUDIOENDPOINT_BYID(devID);
if (SUCCEEDED(hr))
{
hr = m_pEndptVolCtrl->SetMute(bMuted, NULL);
if (SUCCEEDED(hr))
{
bReresult = TRUE;
}
}
UNINIT_IAUDIOENDPPINTVOLUME;
return bReresult;
}

BOOL getSystemMuteStatusLaterWindowVistaByDevID(UINT devID, BOOL& bMuted)
{
if (devID == -1)
{
return getSystemMuteStatusLaterWindowVista(bMuted);
}

BOOL bReresult = FALSE;
IMMDevice *m_pDevice = NULL;
IMMDeviceCollection *m_pCollection = NULL;
IAudioEndpointVolume *m_pEndptVolCtrl = NULL;
IMMDeviceEnumerator *m_pEnumerator = NULL;
HRESULT hr = S_OK;
INIT_IAUDIOENDPOINT_BYID(devID);
if (SUCCEEDED(hr))
{
hr = m_pEndptVolCtrl->GetMute(&bMuted);
if (SUCCEEDED(hr))
{
bReresult = TRUE;
}
}
UNINIT_IAUDIOENDPPINTVOLUME;
return bReresult;
}

static chStringA s_strDevName;
static BOOL bMuted = FALSE;
static bool bCancelMuted = false;
bool setSpeakerDevName(const chConstStringA& strDevName)
{
if (strDevName != s_strDevName)
{
s_strDevName = strDevName;
return true;
}
return false;
}

bool cancleSpeakerDevMute()
{
if (s_strDevName.empty())
{
return false;
}
bCancelMuted = true;
UINT iDevID = GetDevIDByName(s_strDevName);
getSystemMuteStatusLaterWindowVistaByDevID(iDevID, bMuted);
setSystemMuteLaterWindowVistaByDevID(iDevID, FALSE);
}

bool returnSpeakerDevMute()
{
if (s_strDevName.empty() || !bCancelMuted)
{
return false;
}
bCancelMuted = false;
UINT iDevID = GetDevIDByName(s_strDevName);
setSystemMuteLaterWindowVistaByDevID(iDevID, bMuted);
}

解除win7系统静音的更多相关文章

  1. win7系统VPN设置

    为了解除公司上网策略限制,或者为了上Google,Facebook,都可以通过设置VPN实现. 要使用VPN需要到VPN服务商注册,链接VPN服务商. ======================== ...

  2. 解除win7网络限速.

    在电脑刚买或者系统重装了的时候,win7系统会默认限制20%的网络速度,限制了我们的上网速度,我们可以解决这个限制,让上网变得更快 下面是操作步骤 1.开始>运行 2.输入以下命令,然后确定 g ...

  3. 最新win7系统64位和32位系统Ghost装机稳定版下载

    系统来自转载:系统妈 一.主要更新:========================== * 更新了系统补丁和Office2007 SP2所有补丁 通过微软漏洞扫描* 更新QQ至7.1  官方正式版* ...

  4. win7系统下python安装numpy,matplotlib,scipy和scikit-learn

    1.安装numpy,matplotlib,scipy和scikit-learn win7系统下直接采用pip或者下载源文件进行安装numpy,matplotlib,scipy时会遇到各种问题,这是因为 ...

  5. win7系统网卡驱动正常,网线连接设备正常,但电脑右下角网络图片显示一直在转圈或者显示一个黄色感叹号的解决办法

    今天遇到一个问题是电脑的win7系统一直都可以连接有线,但今天突然连接不了.在我的电脑右键-->管理--->设备管理器-->网络适配器,里面查看了网络适配器安装正常.但是电脑右下角的 ...

  6. Win8换成Win7系统问题小结(修改主板BIOS方法)

    问题描述: 笔记本电脑W8系统使用不习惯,想要换成W7系统,但不管是用光盘安装亦或是用U盘安装,在设置系统启动项的时候,选择从光盘启动或从U盘启动,但是回车点了之后没反应. 下面就说说问题的原因及解决 ...

  7. win7系统下如何配置php-Apache-mysql环境

    如何在win7系统下配置php环境呢,php+Apache+mysql都是在配置过程中必不可少的元素,php负责解析php代码,apache负责服务器端而mysql是数据交互的中转站. 那么如何将ph ...

  8. 深度技术GHOST WIN7系统32.64位j极速安装版 V2016年

    系统来自系统妈:http://www.xitongma.com 深度技术GHOST win7系统64位j极速安装版 V2016年3月 系统概述 深度技术ghost win7系统64位j极速安装版  版 ...

  9. win7系统中如何使文件显示出扩展名

    win7系统中如何使文件显示出扩展名-------------------- 1.点击计算机-->>点击组织,然后选择"文件夹及搜索选项"-->> ---- ...

随机推荐

  1. [翻译] WCF运行时架构

    原文地址 http://www.cnblogs.com/idior/articles/971252.html 介绍 WCF具有非常易用的编程模型,服务开发者在掌握ABC的概念后可以很容易的使用WCF去 ...

  2. @ResponseBody 返回中文乱码问题解决 spingmvc

    <!-- UTF8解决乱码问题 --> <bean class="org.springframework.web.servlet.mvc.method.annotation ...

  3. 入口点函数的19种消息,AcRxArxApp只处理16种。

    AcRx::AppMsgCode一共有19种消息. 但由IMPLEMENT_ARX_ENTRYPOINT宏实现的App类,只处理了16种消息. 缺: kSuspendMsg = 16,    kIni ...

  4. Visual.Studio.2013.IDE+visual.studio.15.preview5 编译器

    硬盘版Visual.Studio.2013.IDE + visual.studio.15.preview5 编译器 使用前注意以下事项: 1.右键-管理员权限安装,VS15补丁.exe,补丁是VS15 ...

  5. 报错:严重: Servlet.service() for servlet [jsp] in context with path [/20161116-Struts2-6] threw exception [/index.jsp (line: 13, column: 20) No tag "textfiled" defined in tag library imported with prefix

    严重: Servlet.service() for servlet [jsp] in context with path [/20161116-Struts2-6] threw exception [ ...

  6. [网络] 用 OpenVPN 实现站对站 VPN 服务

    一.简介 一般情况下站对站 VPN 是用 cisco.juniper.h3c等品牌的专业设备实现的,这些设备性能可靠,价格较贵. 如果现有设备不支持,而且不能用新设备替换,或者部门预算有限,那么只能用 ...

  7. python(27)requests 爬取网页乱码,解决方法

    最近遇到爬取网页乱码的情况,找了好久找到了种解决的办法: html = requests.get(url,headers = head) html.apparent_encoding html.enc ...

  8. ORA-02049: 超时: 分布式事务处理等待锁的解决方法

    是其他地方执行了操作没有提交,把其他地方提交了就好了

  9. Lambda表达式的演化,委托-匿名方法-Func-Lambda

    匿名方法 很多时候委托接收的方法是一次性的或者方法体是非常简单的... 例三: 我们可以写成: 有没有发现我们每次都要定义委托,很多时候签名可能是一样的.这样就没有必要定义重复的. 然后又过了很久很久 ...

  10. 编译错误:error: multi-line comment

    编译错误:error: multi-line comment  这其实是有宏定义的地方的问题. 原因是宏定义非一行,在宏定义的行尾使用 '\' 连接符导致的. 所以这个地方的注释使用 /*   */ ...