由于产品的一个新需求,所以开始研究耳机检测,网络上大部分的代码都是通过com接口实现的。我也是使用这总方法做检测的,继承了IMMNotificationClient类在OnPropertyValueChanged这个方法中收到插拔耳机的回调。但是你一定会发现一个问题就是消息太多了。根本无法识别哪一个回调是插耳机哪一个是拔耳机。我当时的想法就是通过这个消息作为回调触发。而检测耳机是否插拔在其他的地方处理。我自己实现一个检测耳机是否插拔的函数。
int CMMNotificationClientModel::IsCurInsertEarPhone() { IKsJackDescription *pJackDesc = NULL; HRESULT hr = S_OK; if (!_pPart) return -1; //获取描述外接设备信息 hr = _pPart->Activate(CLSCTX_INPROC_SERVER, __uuidof(IKsJackDescription), (void**)&pJackDesc); if (hr != S_OK) { return -1; } UINT num = 0; pJackDesc->GetJackCount(&num); //wprintf_s(_T("GetJackCount: %d\n"), num); for (UINT j = 0; j < num; ++j) { KSJACK_DESCRIPTION ksjack_desc = { 0 }; hr = pJackDesc->GetJackDescription(j, &ksjack_desc); if (hr == S_OK) { //wprintf_s(_T("Jack%d PortConnection: %d\n"), j + 1, ksjack_desc.PortConnection); //端口类型 //wprintf_s(_T("Jack%d ConnectionType: %d\n"), j + 1, ksjack_desc.ConnectionType); //连接类型 //wprintf_s(_T("Jack%d IsConnected: %d\n\n"), j + 1, ksjack_desc.IsConnected); //连接状态 if (ksjack_desc.IsConnected) { if (ksjack_desc.ConnectionType == eConnType3Point5mm)//连接类型 { SAFE_RELEASE(pJackDesc) m_iType = 1; return 1; } } } } m_iType = 0; return 0; }通过这个函数可以查询耳机是否插入。其他代码在网上都能查到,如果有什么不明白的可以提问,具体的例子可以可以参考https://download.csdn.net/download/u011569253/10113274