2016-07-19 7 views
1

에 장치를 연결하고 수신 - 수신 호출을하기 위해 tapi 프로그래밍을 사용하고 있습니다. 이 순간에 나는 외부 전화를 걸 수 있으며, 전화를받을 때 누가 나를 부르고 있는지 "볼"수 있습니다. 어떤 이유로 인해 번이 < CALL_STATE.CS_OFFERING> (전화벨이 울릴 때)에 표시되지 않습니다. 아래 코드를 게시하십시오 (인터넷에있는 것과 비슷합니다). 도움이 될 것입니다! 문제의 같은 종류의CALL_STATE.CS_OFFERING이 TAPI 프로그래밍에서 작동하지 않습니다.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace TapiSample 
{ 
public partial class Form1 : Form 
{ 
    static public IAsyncResult result; 
    public Form1() 
    { 
     InitializeComponent(); 

     tapi = new TAPI3Lib.TAPIClass(); 
     tapi.Initialize(); 
     foreach (TAPI3Lib.ITAddress ad in (tapi.Addresses as TAPI3Lib.ITCollection)) 
     { 
      cbLines.Items.Add(ad.AddressName); 
     } 

     tapi.EventFilter = (int)(TAPI3Lib.TAPI_EVENT.TE_CALLNOTIFICATION | 
     TAPI3Lib.TAPI_EVENT.TE_CALLINFOCHANGE | 
     TAPI3Lib.TAPI_EVENT.TE_DIGITEVENT | 
     TAPI3Lib.TAPI_EVENT.TE_PHONEEVENT | 
     TAPI3Lib.TAPI_EVENT.TE_CALLSTATE | 
     TAPI3Lib.TAPI_EVENT.TE_GENERATEEVENT | 
     TAPI3Lib.TAPI_EVENT.TE_GATHERDIGITS | 
     TAPI3Lib.TAPI_EVENT.TE_REQUEST); 
     tapi.ITTAPIEventNotification_Event_Event += new TAPI3Lib.ITTAPIEventNotification_EventEventHandler(tapi_ITTAPIEventNotification_Event_Event); 
    } 

    TAPI3Lib.TAPIClass tapi = null; 
    TAPI3Lib.ITAddress line = null; 
    int cn = 0; 
    private void button1_Click(object sender, EventArgs e) 
    { 
     if (line != null) 
     { 
      line = null; 
      if (cn != 0) tapi.UnregisterNotifications(cn); 
     } 
     foreach (TAPI3Lib.ITAddress ad in (tapi.Addresses as TAPI3Lib.ITCollection)) 
     { 
      if (ad.AddressName == cbLines.Text) 
      { 
       line = ad; 
       break; 
      } 
     } 
     if (line != null) 
     { 
      cn = tapi.RegisterCallNotifications(line, true, true, TAPI3Lib.TapiConstants.TAPIMEDIATYPE_AUDIO, 2); 
     } 
    } 

    private void Form1_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     if (cn != 0) tapi.UnregisterNotifications(cn); 
    } 

    delegate void AddLogDelegate(string text); 
    private void AddLog(string text) 
    { 
     if (this.InvokeRequired) 
     { 
      result = this.BeginInvoke(new AddLogDelegate(AddLog), new object[] { text }); 
     } 
     listBox1.Items.Insert(0, text); 
    } 

    private void tapi_ITTAPIEventNotification_Event_Event(TAPI3Lib.TAPI_EVENT TapiEvent, object pEvent) 
    { 
     try 
     { 
      switch (TapiEvent) 
      { 
       case TAPI3Lib.TAPI_EVENT.TE_CALLNOTIFICATION: 
        AddLog("call notification event has occured"); 
        break; 
       case TAPI3Lib.TAPI_EVENT.TE_CALLSTATE: 
        TAPI3Lib.ITCallStateEvent tcallStateEvent = (TAPI3Lib.ITCallStateEvent)pEvent; 
        TAPI3Lib.ITCallInfo b = tcallStateEvent.Call; 
        switch (b.CallState) 
        { 
         case TAPI3Lib.CALL_STATE.CS_OFFERING: 
          string str2 = b.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLERIDNUMBER); 
          AddLog("Number Calling:" + str2); //Doesn't work 
          return; 
         case TAPI3Lib.CALL_STATE.CS_CONNECTED: 
          string str = b.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLERIDNUMBER); 
          AddLog("Communicating with: " + str); 
          return; 
         case TAPI3Lib.CALL_STATE.CS_DISCONNECTED: 
          this.EndInvoke(result); 
          AddLog("Call Disconnected"); 
          return; 
        } 
        break; 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     if (line == null) return; 
     TAPI3Lib.ITBasicCallControl bc = line.CreateCall(teNumber.Text, TAPI3Lib.TapiConstants.LINEADDRESSTYPE_PHONENUMBER, TAPI3Lib.TapiConstants.TAPIMEDIATYPE_AUDIO); 
     bc.Connect(false); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    } 
} 
+0

이 코드를 사용하여 문제가 해결 되었습니까? –

+0

아니, 그래서 나는 그것을 받아들이지 않았다. 내가 게시 한 코드와 다른 코드를 원하지 않습니다. 나는 그 문제가 어디 있는지 이해할 수 있었고 나 혼자서 해결하려고 노력했다. 어쨌든 많은 시간을 들여서 대답했다. –

답변

1

나는 당신이 또한 .wav 파일로 걸려 오는 전화를 녹음 할 수 있습니다, 당신은이 샘플을 사용하여 dll, 을 다운로드 할 수 있습니다 Julmar에 의해 작성 타이 피는를위한 관리 C#을 래퍼를 사용

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

내부적으로 TAPI는 상태와 호출 정보를 별도로 처리합니다. 따라서 전화 번호 (a.k.a.CLIP)는 제공 상태 전후로 전송 될 수 있습니다. 그러므로 CLIP을 제공 할 때 보장 할 수는 없습니다. 나중에 전화 정보 변경 이벤트에 올 수 있습니다.

이미 필터에서 TAPI3Lib.TAPI_EVENT.TE_CALLINFOCHANGE을 (를) 요청하고 있지만 TapiEvent switch 문에서 처리하지 않았습니다. 따라서 이것을 구현해야합니다.

사이드 노트 : CLIP이없는 것이 가능합니다.

+0

TapiEvent에 대한 예를 들어 줄 수 있니? –

+1

TAPI3Lib을 사용하지 않으므로 샘플 코드를 제공 할 수 없습니다. 그러나 전화 상태 코드와 매우 유사 할 것으로 의심됩니다. –