2014-07-06 59 views
0

我在C#中爲地面線路電話編寫TAPI 3.0應用程序。 我的目標是接收和記錄呼叫。 到目前爲止,在我的代碼中,第一次調用一切正常,所有事件都觸發。Tapi 3和C#第一次調用後沒有事件觸發

但不幸的是,所有後續調用完全由TAPI第一個電話後忽略

沒有任何事件觸發,直到我再次重新啓動應用程序。

一件事,我已經找到了,而如果我重置基於Tapi例如它可以解決我的問題,谷歌搜索,

誰能告訴如何重置基於Tapi對象?

這裏是我的代碼

void initializetapi3() 
{ 
    try 
    { 
     tobj = new TAPIClass(); 
     tobj.Initialize(); 
     IEnumAddress ea=tobj.EnumerateAddresses(); 
     ITAddress ln; 
     uint arg3=0; 
     lines=0; 

     cn=new callnotification(); 
     cn.addtolist=new callnotification.listshow(this.status); 
     tobj.ITTAPIEventNotification_Event_Event+= new TAPI3Lib.ITTAPIEventNotification_EventEventHandler(cn.Event); 
     tobj.EventFilter=(int)(TAPI_EVENT.TE_CALLNOTIFICATION| 
      TAPI_EVENT.TE_DIGITEVENT| 
      TAPI_EVENT.TE_PHONEEVENT| 
      TAPI_EVENT.TE_CALLSTATE| 
      TAPI_EVENT.TE_GENERATEEVENT| 
      TAPI_EVENT.TE_GATHERDIGITS| 
      TAPI_EVENT.TE_REQUEST|TAPI_EVENT.TE_CALLINFOCHANGE); 


     for(int i=0;i<10;i++) 
     { 
      ea.Next(1,out ln,ref arg3); 
      ia[i]=ln; 
      if(ln!=null) 
      { 
       comboBox1.Items.Add(ia[i].AddressName); 
       lines++; 
      } 
      else 
       break; 
     } 


    } 
    catch(Exception e) 
    { 
     MessageBox.Show(e.ToString()); 
    } 
} 

delegate void valueDelegate(string value); 

public void status(string str) 
{ 
    if (textBox1.InvokeRequired) 
    { 
     textBox1.Invoke(new valueDelegate(status), str); 
    } 
    else 
    { 
     textBox1.Text = str; 
    } 
} 

public void Event(TAPI3Lib.TAPI_EVENT te, object eobj) 
{ 
    switch (te) 
    { 
     case TAPI3Lib.TAPI_EVENT.TE_CALLNOTIFICATION: 
      status("call notification event has occured"); 
      break; 
     case TAPI3Lib.TAPI_EVENT.TE_PHONEEVENT: 
      status("A phone event!"); 
      break; 
     case TAPI3Lib.TAPI_EVENT.TE_CALLSTATE: 
      TAPI3Lib.ITCallStateEvent a = (TAPI3Lib.ITCallStateEvent)eobj; 
      TAPI3Lib.ITCallInfo b = a.Call; 
      switch (b.CallState) 
      { 
       case TAPI3Lib.CALL_STATE.CS_INPROGRESS: 

        status("dialing"); 
        break; 
       case TAPI3Lib.CALL_STATE.CS_CONNECTED: 
        status("Connected"); 
        break; 
       case TAPI3Lib.CALL_STATE.CS_DISCONNECTED: 
        status("Disconnected"); 
        break; 
       case TAPI3Lib.CALL_STATE.CS_OFFERING: 
        status("A party wants to communicate with you!"); 
        break; 
       case TAPI3Lib.CALL_STATE.CS_IDLE: 
        status("Call is created!"); 
        break; 
      } 
      break; 
    } 
} 
+0

我想避免下面的第一個解決方案,如果可以的話,下面的第二個解決方案不適合我。你自己找到了解決方案嗎? – Rob

+0

沒關係,我找到了解決辦法,看到下面的答案 – Rob

回答

0

對於這個問題,我使用基於Tapi通過Julmar寫的託管C#的包裝,可以是downloaded, 通過採用該試樣來電也以.wav F爲recroded ormat

TPhone tphone; 
    TTapi tobj; 
    TTerminal recordTerminal; 
    TCall CurrCall; 


    void InitializeTapi() 
    { 
     tobj = new TTapi(); 
     tobj.Initialize(); 

     tobj.TE_CALLNOTIFICATION += new System.EventHandler<JulMar.Tapi3.TapiCallNotificationEventArgs>(this.OnNewCall); 
     tobj.TE_CALLSTATE += new System.EventHandler<JulMar.Tapi3.TapiCallStateEventArgs>(this.OnCallState);  
     tobj.TE_CALLINFOCHANGE += tobj_TE_CALLINFOCHANGE; 


     foreach (TPhone tp in tobj.Phones) 
     { 
      tphone = tp; 
      tphone.Open(PHONE_PRIVILEGE.PP_OWNER); 

     } 


     foreach (TAddress addr in tobj.Addresses) 
     { 
      if (addr.QueryMediaType(TAPIMEDIATYPES.AUDIO)) 
      { 
       try 
       { 
        addr.Open(TAPIMEDIATYPES.AUDIO); 
       } 
       catch (TapiException ex) 
       { 
        if (ex.ErrorCode == unchecked((int)0x80040004)) 
        { 
         try 
         { 
          addr.Open(TAPIMEDIATYPES.DATAMODEM); 

         } 
         catch (Exception ex2) 
         { 
         } 
        } 
       } 
      } 
     } 
    } 




    void tobj_TE_CALLINFOCHANGE(object sender, TapiCallInfoChangeEventArgs e) 
    { 
     try 
     { 

      CurrCall = e.Call; 
      txtCallerId.Text = e.Call.get_CallInfo(CALLINFO_STRING.CIS_CALLERIDNUMBER).ToString(); 
      objCallLog.CallerID = txtCallerId.Text; 

      Task.Factory.StartNew(() => AnswerCall());    


     } 
     catch (Exception ex) 
     { 

     } 
    } 

    void OnNewCall(object sender, TapiCallNotificationEventArgs e) 
    { 
     CurrCall = e.Call; 
    } 

    void OnCallState(object sender, EventArgs E) 
    { 
     try 
     { 
      TapiCallStateEventArgs e = E as TapiCallStateEventArgs; 
      CurrCall = e.Call; 


      TapiPhoneEventArgs ev = E as TapiPhoneEventArgs; 

      switch (e.State) 
      { 

       case CALL_STATE.CS_OFFERING: 

        break; 

       case CALL_STATE.CS_CONNECTED: 


        break; 

       case CALL_STATE.CS_DISCONNECTED: 

        try 
        { 
         if (recordTerminal != null) 
          recordTerminal.Stop(); 
         recordTerminal = null; 

         CurrCall.Dispose(); 

        } 
        catch (Exception ex) 
        { 
        } 
        finally 
        { 
         CurrCall = null; 
        } 



        break; 
      } 


     } 
     catch (Exception ex) 
     { 

     } 
    } 

    void OnCallChangeEvent(object sender, TapiCallInfoChangeEventArgs e) 
    { 
     CurrCall = e.Call; 
    } 



private void AnswerCall() 
    { 
     try 
     { 
      lock (lockAnswer) 
      { 
       if (CallStat == CallState.Offering) 
       { 
        CurrCall.Answer(); 
        RecordConversation(); 
       } 
       else 
       { 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
    } 

    void RecordConversation() 
    { 


     if (CurrCall != null) 
     { 
      try 
      { 
       recordTerminal = CurrCall.RequestTerminal(
       TTerminal.FileRecordingTerminal, 
       TAPIMEDIATYPES.MULTITRACK, TERMINAL_DIRECTION.TD_RENDER); 
       if (recordTerminal != null) 
       { 
        recordTerminal.RecordFileName = "FileName.wav"; 
        CurrCall.SelectTerminalOnCall(recordTerminal); 
        recordTerminal.Start(); 
       } 
       else 
       { 
        MessageBox.Show("Error in recording file."); 
       } 
      } 
      catch (TapiException ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 

     } 

    } 
+0

哇,這被評爲awer,但我測試了你的代碼,它甚至沒有編譯...'TapiPhoneEventArgs ev = E作爲TapiPhoneEventArgs;' 不會工作和'如果(CallStat == CallState.Offering)'CallStat甚至不存在...''lockAnswer'也不存在。 爲什麼我甚至會打擾它嘗試... – sLowDowN

0

你有沒有打過電話:

tobj.Shutdown(); 
initializetapi3(); 

接收TAPI3Lib.CALL_STATE.CS_DISCONNECTED事件之後(或任何事件之後)? 因此,例如:

case TAPI3Lib.CALL_STATE.CS_DISCONNECTED: 
    status("Disconnected"); 
    tobj.Shutdown(); 
    initializetapi3(); 
    break; 
+0

沒有沒有工作 –

1

這將正常工作爲你....:

Private void initializetapi3() 
{ 
    try 
    { 
     tobj = new TAPIClass(); 
     tobj.Initialize(); 
     IEnumAddress ea=tobj.EnumerateAddresses(); 
     ITAddress ln; 
     uint arg3=0; 
     lines=0; 
     cn=new callnotification(); 
     cn.addtolist=new callnotification.listshow(this.status); 
     tobj.ITTAPIEventNotification_Event_Event+= new TAPI3Lib.ITTAPIEventNotification_EventEventHandler(cn.Event); 
     tobj.EventFilter=(int)(TAPI_EVENT.TE_CALLNOTIFICATION| 
      TAPI_EVENT.TE_DIGITEVENT| 
      TAPI_EVENT.TE_PHONEEVENT| 
      TAPI_EVENT.TE_CALLSTATE| 
      TAPI_EVENT.TE_GENERATEEVENT| 
      TAPI_EVENT.TE_GATHERDIGITS| 
      TAPI_EVENT.TE_REQUEST|TAPI_EVENT.TE_CALLINFOCHANGE); 


     for(int i=0;i<10;i++) 
     { 
      ea.Next(1,out ln,ref arg3); 
      ia[i]=ln; 
      if(ln!=null) 
      { 
       comboBox1.Items.Add(ia[i].AddressName); 
       lines++; 
      } 
      else 
       break; 
     } 


    } 
    catch(Exception e) 
    { 
     MessageBox.Show(e.ToString()); 
    } 
} 

delegate void valueDelegate(string value); 

public void status(string str) 
{ 
    if (textBox1.InvokeRequired) 
    { 
     textBox1.Invoke(new valueDelegate(status), str); 
    } 
    else 
    { 
     textBox1.Text = str; 
    } 
} 

public void Event(TAPI3Lib.TAPI_EVENT te, object eobj) 
{ 
    switch (te) 
    { 
     case TAPI3Lib.TAPI_EVENT.TE_CALLNOTIFICATION: 
     var cn = te as TAPI3Lib.ITCallNotificationEvent; 
     int counter = 0; 
     while (cn.Call.CallState == TAPI3Lib.CALL_STATE.CS_IDLE && ++counter < 3) 
     { 
      System.Threading.Thread.Sleep(1000); 
     } 
      status("call notification event has occured"); 
      break; 
     case TAPI3Lib.TAPI_EVENT.TE_PHONEEVENT: 
      status("A phone event!"); 
      break; 
     case TAPI3Lib.TAPI_EVENT.TE_CALLSTATE: 
      TAPI3Lib.ITCallStateEvent a = (TAPI3Lib.ITCallStateEvent)eobj; 
      TAPI3Lib.ITCallInfo b = a.Call; 
      switch (b.CallState) 
      { 
       case TAPI3Lib.CALL_STATE.CS_INPROGRESS: 

        status("dialing"); 
        break; 
       case TAPI3Lib.CALL_STATE.CS_CONNECTED: 
        status("Connected"); 
        break; 
       case TAPI3Lib.CALL_STATE.CS_DISCONNECTED: 
        status("Disconnected"); 
        break; 
       case TAPI3Lib.CALL_STATE.CS_OFFERING: 
        status("A party wants to communicate with you!"); 
        break; 
       case TAPI3Lib.CALL_STATE.CS_IDLE: 
        status("Call is created!"); 
        break; 
      } 
      break; 
    } 
} 

那是因爲在第一個打電話給你的呼叫狀態的空閒時間小於毫秒。

+0

爲什麼不用'counter ++ <2'?因爲'++ counter <3'只會是真的兩次 – sLowDowN

0

的解決方案是等到TAPI callstate斷開事件,並且一旦發生了這種情況:

一個)UnRegisterDeviceForEvents與斷開事件相關聯的裝置地址,然後

b)中RegisterCallNotifications相關聯的裝置地址與斷開事件

相關問題