Tapi 3和C#首次呼叫后无事件触发

Tapi 3和C#首次呼叫后无事件触发,c#,tapi,C#,Tapi,我正在用C#为陆地电话编写TAPI 3.0应用程序。 我的目标是接听和记录电话。 到目前为止,在我的代码中,对于第一次调用,所有事件都可以正常工作 但不幸的是,TAPI在第一次调用和 在我重新启动应用程序之前,不会触发任何事件。 我在谷歌搜索时发现,如果我重置Tapi实例,它可以解决我的问题 有人知道如何重置Tapi对象吗? 这是我的密码 void initializetapi3() { try { tobj = new TAPIClass();

我正在用C#为陆地电话编写TAPI 3.0应用程序。 我的目标是接听和记录电话。 到目前为止,在我的代码中,对于第一次调用,所有事件都可以正常工作

但不幸的是,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;
    }
}
void initializetapi3()
{
尝试
{
tobj=新TAPIClass();
tobj.Initialize();
IEnumAddress ea=tobj.EnumerateAddresses();
地址ln;
uint arg3=0;
直线=0;
cn=新的callnotification();
cn.addtolist=newcallnotification.listshow(this.status);
tobj.ITTAPIEventNotification_Event_Event+=新的TAPI3Lib.ITTAPIEventNotification_eventhandler(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_|
TAPI_EVENT.TE_REQUEST | TAPI_EVENT.TE_callinfo change);

对于(int i=0;i您是否尝试过拨打:

tobj.Shutdown();
initializetapi3();
在收到TAPI3Lib.CALL_STATE.CS_断开连接事件后(或在任何事件后)? 例如:

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

这对您很有用……:

Private void initializetapi()
{
    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++ < 2)
        {
            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;
    }
}
Private void initializetapi()
{
尝试
{
tobj=新TAPIClass();
tobj.Initialize();
IEnumAddress ea=tobj.EnumerateAddresses();
地址ln;
uint arg3=0;
直线=0;
cn=新的callnotification();
cn.addtolist=newcallnotification.listshow(this.status);
tobj.ITTAPIEventNotification_Event_Event+=新的TAPI3Lib.ITTAPIEventNotification_eventhandler(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_|
TAPI_EVENT.TE_REQUEST | TAPI_EVENT.TE_callinfo change);

对于(int i=0;i,解决方案是等待tapi callstate断开连接事件,一旦发生:

a) UnregisterDevice提供与断开连接事件关联的设备地址,然后


b) RegisterCallNotifications与断开连接事件关联的设备地址

对于此问题,我为Tapi使用了托管C#包装器,由编写,可以是, 通过使用此示例,传入呼叫也可以以.wav格式重新编码

    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());
            }

        }

    }
TPhone-TPhone;
TTapi-tobj;
终端终端;
t呼叫;
void InitializeTapi()
{
tobj=新的TTapi();
tobj.Initialize();
tobj.TE_CALLNOTIFICATION+=新的System.EventHandler(this.OnNewCall);
tobj.TE_CALLSTATE+=new System.EventHandler(this.OnCallState);
tobj.TE_callinfo change+=tobj_TE_callinfo change;
foreach(tobj.电话中的TPhone tp)
{
tphone=tp;
tphone.Open(PHONE\u PRIVILEGE.PP\u OWNER);
}
foreach(地址为tobj.地址中的地址)
{
if(addr.QueryMediaType(TAPIMEDIATYPES.AUDIO))
{
尝试
{
地址打开(TAPIMEDIATYPES.AUDIO);
}
捕获(TapiException ex)
{
如果(ex.ErrorCode==未选中((int)0x80040004))
{
尝试
{
地址打开(TAPIMEDIATYPES.DATAMODEM);
}
捕获(异常ex2)
{
}
}
}
}
}
}
void tobj_TE_CallInfo更改(对象发送方,TapiCallInfoChangeEventArgs e)
{
尝试
{
CurrCall=e.Call;
txtCallerId.Text=e.Call.get_CallInfo(CallInfo_STRING.CIS_CALLERIDNUMBER).ToString();
objCallLog.CallerID=txtCallerId.Text;
Task.Factory.StartNew(()=>AnswerCall());
}
捕获(例外情况除外)
{
}
}
void OnNewCall(对象发送方,TapiCallNotificationEventArgs e)
{
CurrCall=e.Call;
}
void OnCallState(对象发送方、事件参数)
{
尝试
{
TapiCallStateEventArgs e=e作为TapiCallStateEventArgs;
CurrCall=e.Call;
TapiPhoneEventArgs ev=E作为TapiPhoneEventArgs;
开关(即状态)
{
案例调用\u STATE.CS\u提供:
打破
案例呼叫\u STATE.CS\u已连接:
打破
案例呼叫\u STATE.CS\u已断开:
尝试
{
if(recordTerminal!=null)
recordTerminal.Stop();
recordTerminal=null;
CurrCall.Dispose();
}
捕获(例外情况除外)
{
}
最后
{
CurrCall=null;
}
打破
}
}
捕获(例外情况除外)
{
}
}
void OnCallChangeEvent(对象发送方,TapiCallInfoChangeEventArgs e)
{
CurrCall=e.Call;
}
私人无效应答呼叫()
{
尝试
{
锁定(锁定应答)
{
if(CallStat==CallState.providing)
{
CurrCall.Answer();
RecordConversation();
}
其他的