windows7下检测耳机麦克拔插

本文介绍了一个基于Windows音频API的音频设备通知客户端的实现过程。该客户端通过使用IMMNotificationClient接口监听音频设备的变化,并在设备状态改变时输出相关信息。文章详细展示了如何创建和注册通知客户端,以及如何正确地管理资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#include <mmdeviceapi.h>
#include "iostream"
using namespace std;  


class CMMNotificationClient : public IMMNotificationClient 
{ 
public:
	IMMDeviceEnumerator *m_pEnumerator;
	CMMNotificationClient():
	_cRef(1),
	m_pEnumerator(NULL)
	{
		//初始化COM
		::CoInitialize(NULL);
		HRESULT hr = S_OK; 
		
		//创建接口
		hr = CoCreateInstance( 
			__uuidof(MMDeviceEnumerator), NULL, 
			CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), 
			(void**)&m_pEnumerator); 

		if (hr==S_OK) 
		{ 
			cout<<"接口创建成功"<<endl; 
		} 
		else 
		{ 
			cout<<"接口创建失败"<<endl; 
		} 
		//注册事件
		hr = m_pEnumerator->RegisterEndpointNotificationCallback((IMMNotificationClient*)this); 
		if (hr==S_OK) 
		{ 
			cout<<"注册成功"<<endl; 
		} 
		else 
		{ 
			cout<<"注册失败"<<endl; 
		} 
	}

	~CMMNotificationClient()
	{
		SAFE_RELEASE(m_pEnumerator)
		::CoUninitialize(); 
	}


	// IUnknown methods -- AddRef, Release, and QueryInterface 
private:
	LONG _cRef; 
	ULONG STDMETHODCALLTYPE AddRef()
	{
		return InterlockedIncrement(&_cRef);
	}

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

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


	HRESULT STDMETHODCALLTYPE OnDefaultDeviceChanged( 
		EDataFlow flow, ERole role, 
		LPCWSTR pwstrDeviceId) 
	{ 
		//cout<<"OnDefaultDeviceChanged"<<endl; 
		return S_OK; 
	} 

	HRESULT STDMETHODCALLTYPE OnDeviceAdded(LPCWSTR pwstrDeviceId) 
	{ 
		return S_OK; 
	}; 

	HRESULT STDMETHODCALLTYPE OnDeviceRemoved(LPCWSTR pwstrDeviceId) 
	{ 

		return S_OK; 
	} 

	HRESULT STDMETHODCALLTYPE OnDeviceStateChanged( 
		LPCWSTR pwstrDeviceId, 
		DWORD dwNewState) 
	{ 
		cout<<"OnDeviceStateChanged"<<endl; 
		return S_OK; 
	} 

	HRESULT STDMETHODCALLTYPE OnPropertyValueChanged( 
		LPCWSTR pwstrDeviceId, 
		const PROPERTYKEY key) 
	{ 

		return S_OK; 
	} 
}; 


int main(int argc, TCHAR* argv[], TCHAR* envp[]) 
{ 
	CMMNotificationClient mmClient;  

	system("pause");
	return 0; 
} 
参考微软文档 https://msdn.microsoft.com/en-us/library/windows/desktop/dd370810(v=vs.85).aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Barry__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值