由于产品的一个新需求,所以开始研究耳机检测,网络上大部分的代码都是通过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