2012-02-15 51 views
3

我想写一个应用程序,使调制解调器连接,然后发送dtmf信号。我的应用程序创建一个呼叫,但它不发送该DTMF信号。TAPI应用程序,不能发送DTMF信号

我正在使用TAPI在C#中编写它。

该代码有什么问题? 在按钮3你可以看到DTMF功能。

我的应用程序:

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Windows.Forms; 

using TAPI3Lib; 

namespace dialer 
{ 

    public partial class MainForm : Form 
    { 
     private TAPIClass tapi; 
     private ITAddress[] adresy = new ITAddress[10]; 
     private ITBasicCallControl polaczenie = null; 
     private int wybrany = -1; 

     public MainForm() 
     { 
      InitializeComponent(); 
      ZainicjalizujTAPI(); 
     } 

     private void ZainicjalizujTAPI() 
     { 
      try 
      { 

       tapi = new TAPIClass(); 
       tapi.Initialize(); 


       IEnumAddress ea = tapi.EnumerateAddresses(); 
       ITAddress adres; 
       uint arg = 0; 

       for(uint i = 0; i < 10; ++i) 
       { 
        ea.Next(1, out adres, ref arg); 
        if(adres == null) break; 
        adresy[i] = adres; 
        listaLinii.Items.Add(adres.AddressName); 
       } 
      } 
      catch(Exception wyj) 
      { 

       MessageBox.Show(wyj.ToString(), "Błąd!"); 
      } 
     } 


     void Button1Click(object sender, EventArgs e) 
     { 
      if(listaLinii.SelectedIndex < 0) 
      { 
       MessageBox.Show("Nie wybrano linii", "Błąd!"); 
       return; 
      } 

      if(polaczenie != null) 
      { 
       MessageBox.Show("Połączenie już istnieje", "Błąd!"); 
       return; 
      } 

      wybrany = listaLinii.SelectedIndex; 

      try 
      { 
       polaczenie = adresy[wybrany].CreateCall("12345678", 
        TapiConstants.LINEADDRESSTYPE_PHONENUMBER, 
        TapiConstants.TAPIMEDIATYPE_DATAMODEM | TapiConstants.TAPIMEDIATYPE_AUDIO); 

       polaczenie.SetQOS(TapiConstants.TAPIMEDIATYPE_DATAMODEM | TapiConstants.TAPIMEDIATYPE_AUDIO, 
       QOS_SERVICE_LEVEL.QSL_BEST_EFFORT); 

       polaczenie.Connect(false); 
      } 
      catch(Exception wyj) 
      { 
       MessageBox.Show(wyj.ToString(), "Błąd!"); 
       polaczenie = null; 
      } 
     } 

     void Button2Click(object sender, EventArgs e) 
     { 
      if(polaczenie == null) return; 

      try 
      { 

       polaczenie.Disconnect(DISCONNECT_CODE.DC_NORMAL); 
       polaczenie = null; 
      } 
      catch(Exception wyj) 
      { 
       MessageBox.Show(wyj.ToString(), "Błąd!"); 
      } 
     } 

     // HERE is the button responsible for sending DTMF signal (doesn't work) 
     void Button3Click(object sender, EventArgs e) 
     { 
      if(polaczenie == null) return; 

      try 
      { 

       ITLegacyCallMediaControl2 cmc = (ITLegacyCallMediaControl2) polaczenie; 
       cmc.GenerateDigits("246", TapiConstants.LINEDIGITMODE_DTMF); 

      } 
      catch(Exception wyj) 
      { 
       MessageBox.Show(wyj.ToString(), "Błąd!"); 
      } 
     } 

     void ListaLiniiSelectedIndexChanged(object sender, EventArgs e) 
     { 

     } 
    } 
+0

.NET不支持通过COM interop直接使用TAPI3.dll。你会遇到随机问题。使用第三方包装器。看到我的答案在这里:http://stackoverflow.com/a/2334053/44522。也可能是您的TAPI驱动程序不支持DTMF。 – MicSim 2012-02-15 13:03:54

+0

感谢您的快速回复,您是否拥有该C++代码的一些示例? – Tyrril 2012-02-16 11:58:28

+0

不,我很抱歉,但我认为有一些样本包含在下载包中。 – MicSim 2012-02-16 12:27:46

回答

0

可以使用ATAPI库为.NET TAPI库。它还包含一些示例,以便您了解TAPI的工作原理。 ATAPI托管在CodePlex中,并获得MIT许可。在Google搜索ATAPI codeplex以获取库。