2016-08-26 19 views
0

전화 상태 및 통화 정보를 데이터베이스 테이블에 기록 할 응용 프로그램이 있습니다. 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; 
     } 
    } 

잘 작동합니다. 특히 연결 해제 할 때마다 장치를 다시 등록 할 때 특히 유용합니다.

그러나 사용자가 단말기에서 핸즈프리로 변경되면 자동으로 전화가 걸리므로 통화 상태 이벤트가 실행되지 않습니다.

해당 통화 도중 장치를 수동으로 다시 등록하면 연결된 통화 상태 이벤트가 발생합니다.

장치가 핸즈프리 상태 인 이유가 통화 상태 이벤트에 어떤 영향을 줄 수 있습니까?

+1

코드를 자세히 보지 않았지만 .NET의 TAPI와 직접 대화한다는 것을 알고 있어야합니다. 가비지 수집기와 자동 생성 된 COM interop 계층은 제대로 작동하지 않으며 작동하는 것처럼 보일 때마다 이상한 문제가 발생합니다. .NET에 TAPI를 적절하게 노출시키는 타사 라이브러리가 있거나 C++/CLI 래퍼 작성 방법을 직접 사용할 수 있습니다. 행운을 빕니다! –

답변

0

나는 TraySoft's AddTapi.Net 라이브러리를 사용하여 끝났습니다.이 라이브러리는 매우 원활하게 작동하며 설정 및 사용이 쉽고 문서가 우수합니다.

그리고 위와 동일하게 거의 코드를 작성하지 않아도됩니다.

2

"핸즈프리"모드는 사용자가받는 이벤트에 영향을 미치면 안됩니다. 다른 응용 프로그램이 동일한 결과를 얻는 지 확인하려면 독립적 인 도구를 사용하는 것이 좋습니다. 드라이버 나 PBX에서 버그를 발견했을 수 있습니다. 계정이없는 경우 , 당신은 여기에 TAPI 소프트 폰을 시도 할 수 있습니다 : 모든 호출이 필요는 없습니다 실제로 한 후 좋은 해를 더 할 수 있습니다 후 다시 등록

또한

http://julmar.com/tapi/

.