2014-07-06 65 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相关联的装置地址与断开事件

相关问题