原文转自 https://blog.csdn.net/rankun1/article/details/50972990

#include "stdafx.h"

#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)
{
switch (dwNewState)
{
case DEVICE_STATE_ACTIVE:
cout << "监测到可用的麦克风。" << endl;
break; case DEVICE_STATE_DISABLED:
cout << "监测到麦克风不可用。" << endl;
break; case DEVICE_STATE_NOTPRESENT:
cout << "监测到麦克风未准备好。" << endl;
break; case DEVICE_STATE_UNPLUGGED:
cout << "监测到麦克风被拔出。" << endl;
break; default:
break;
} 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;
}

windows7下检测耳机麦克拔插(转)的更多相关文章

  1. C# 上位机的USB设备拔插检测

    我们做USB通信时,通信成功后,往往要检测USB设备的拔插状态,这里就USB拔插进行一下说明. 参考:https://www.imooc.com/article/17438 先说明一下,我这里只是用C ...

  2. C#中USB转串口的拔插捕获

    // usb消息定义 public const int WM_DEVICE_CHANGE = 0x219; public const int DBT_DEVICEARRIVAL = 0x8000; p ...

  3. 聊聊iOS开发中耳机的那点事(监听耳机拔插、耳机线控)-b

    如果说一个项目出现的最重大的事故,那无疑就是开发人员使用了不可控的元素. 前言 iOS开发当中有关于视音频播放的开发不在少数,用户时常会使用到一种输出设备,那就是"耳机",这一篇博 ...

  4. iOS 检测耳机插入/拔出

    http://www.verydemo.com/demo_c134_i28481.html 开发过程中录音和播放这块碰到了一些问题,麻烦的主要有三个: 检测是否有声音输入设备 当有多个声音输出设备时, ...

  5. Delphi在Android下实现BroadcastReceiver功能(举例在Delphi下获取USB外设拔插消息)

    在Android里,用java通过实现BroadcastReceiver接口,就可以获得Intent消息.可是Delphi程序不能直接实现JBroadcastReceiver,如何能够实现类似Java ...

  6. iOS检测耳机插入拔出

    首先,需要导入两个框架 然后,注册通知检测耳机的插入与拔出操作 [[NSNotificationCenter defaultCenter] addObserver:self selector:@sel ...

  7. Android -- 检测耳机插入状态

    原理                                                                                    其实android系统在耳机 ...

  8. (一)windows7下solr7.1.0默认jetty服务器环境搭建

    windows7下solr7.1.0默认jetty服务器环境搭建 1.下载solr solr7官网地址:http://lucene.apache.org/solr/ jdk8官网地址:http://w ...

  9. 设计一个可拔插的 IOC 容器

    前言 磨了许久,借助最近的一次通宵上线 cicada 终于更新了 v2.0.0 版本. 之所以大的版本号变为 2,确实是向下不兼容了:主要表现为: 修复了几个反馈的 bug. 灵活的路由方式. 可拔插 ...

随机推荐

  1. Java实现Avl树

    Avl树即左右子树的深度[高度]相差不可超过1,所以在插入key的时候,就会出现需要旋转[更改根节点]的操作 下面是源代码: /* the define of avltree's node */ cl ...

  2. spark的排序方法

    今天我们来介绍spark中排序的操作,spark的排序很简单,我们可以直接使用sortBy来进行,这个里面我们使用case clas,使用case class的好处是1.不用newjiukeyi 搞出 ...

  3. Windows GitLab使用全过程

    1.首先安装Git 1.1.下载网站: https://git-for-windows.github.io/ 1.2.安装Git参考网站 http://blog.csdn.net/u012614287 ...

  4. python字典的整理信息

    字典的增删改查大纲 增: dic={'age':18,'name':'liu','sex':'male'} dic['high'] = 185 #没有键值对,添加 dic['age'] = 16 #有 ...

  5. gradle编译很慢解决方法

    1.升级内存,内存最好在8g以上. 我的12g,编译运行,2s22ms,不到3s. 2.设置Android staido 不要 打开instant run

  6. laravel5.5用户认证源码分析

    目录 1. 生成相关文件和配置 2. 分析路由文件 3. 以登陆开始为例,分析auth到底是怎么工作的 3.1 分析登录文件 3.2 分析门面Auth. 1. 生成相关文件和配置 快速生成命令 php ...

  7. Canvas 给图形绘制阴影

    /** * 图形绘制阴影 */ function initDemo6() { var canvas = document.getElementById("demo6"); if ( ...

  8. HTML5标签学习笔记

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta http-equiv="con ...

  9. 【转载】Unity3D研究院之静态自动检查代码缺陷与隐患

    代码缺陷和代码错误的最大区别是,代码缺陷不影响游戏编译,而代码错误编译都不通过.但是代码缺陷会影响游戏发布后产生的一系列BUG..我今天无意间逛外国论坛发现的一个方法,使用了一下感觉挺给力的第一时间分 ...

  10. python学习总结---文件操作

    # 文件操作 ### 目录管理(os) - 示例 ```python # 执行系统命令 # 清屏 # os.system('cls') # 调出计算器 # os.system('calc') # 查看 ...