전화 상태 및 통화 정보를 데이터베이스 테이블에 기록 할 응용 프로그램이 있습니다. interop.TAPI3Lib dll과 TAPI3 드라이버를 사용하여 호출 정보에 연결합니다. 다음은 TAPI 3 장치 상태가 통화 중일 때 통화 상태 이벤트가 발생하지 않음
내가 생각 관련된 코드의 부분입니다 내가 CallState 이벤트tapi.EventFilter = (int)(TAPI3Lib.TAPI_EVENT.TE_CALLSTATE);
tapi.ITTAPIEventNotification_Event_Event += new
TAPI3Lib.ITTAPIEventNotification_EventEventHandler(tapi_ITTAPIEventNotification_Event_Event);
내가
RegEventsResult[line] =
tapi.RegisterCallNotifications(
address,
true,
false,
TAPI3Lib.TapiConstants.TAPIMEDIATYPE_AUDIO, 2);
을 모니터링 할 각 장치 (주소)를 등록 수신
전화 상태 변경 결과를 기록합니다.
private void tapi_ITTAPIEventNotification_Event_Event(TAPI3Lib.TAPI_EVENT TapiEvent, object pEvent)
{
string callerID, group, extension;
long origin;
TAPI3Lib.ITAddress address;
switch (TapiEvent)
{
case TAPI3Lib.TAPI_EVENT.TE_CALLSTATE:
TAPI3Lib.ITCallStateEvent callStateEvent = (TAPI3Lib.ITCallStateEvent)pEvent;
TAPI3Lib.ITCallInfo call = callStateEvent.Call;
extension = call.Address.DialableAddress;
address = call.Address;
switch (call.CallState)
{
case TAPI3Lib.CALL_STATE.CS_INPROGRESS:
callerID = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLERIDNUMBER);
group = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLEDIDNAME);
AddLog("InProgress", callerID, group, extension);
break;
case TAPI3Lib.CALL_STATE.CS_CONNECTED:
callerID = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLERIDNUMBER);
group = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLEDIDNAME);
AddLog("Connected", callerID, group, extension);
break;
case TAPI3Lib.CALL_STATE.CS_OFFERING:
callerID = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLERIDNUMBER);
group = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLEDIDNAME);
AddLog("Offering", callerID, group, extension);
break;
case TAPI3Lib.CALL_STATE.CS_DISCONNECTED:
AddLog("Disconnected", "", "", extension);
resetNotification(extension, address);
break;
case TAPI3Lib.CALL_STATE.CS_IDLE:
AddLog("Idle", "", "", extension);
break;
}
break;
}
}
잘 작동합니다. 특히 연결 해제 할 때마다 장치를 다시 등록 할 때 특히 유용합니다.
그러나 사용자가 단말기에서 핸즈프리로 변경되면 자동으로 전화가 걸리므로 통화 상태 이벤트가 실행되지 않습니다.
해당 통화 도중 장치를 수동으로 다시 등록하면 연결된 통화 상태 이벤트가 발생합니다.
장치가 핸즈프리 상태 인 이유가 통화 상태 이벤트에 어떤 영향을 줄 수 있습니까?
코드를 자세히 보지 않았지만 .NET의 TAPI와 직접 대화한다는 것을 알고 있어야합니다. 가비지 수집기와 자동 생성 된 COM interop 계층은 제대로 작동하지 않으며 작동하는 것처럼 보일 때마다 이상한 문제가 발생합니다. .NET에 TAPI를 적절하게 노출시키는 타사 라이브러리가 있거나 C++/CLI 래퍼 작성 방법을 직접 사용할 수 있습니다. 행운을 빕니다! –