我正在用C#为陆线电话编写TAPI 3.0应用程序。 我的目标是接收和录制电话。 到目前为止,在我的Code Code Everything在第一次调用时工作正常,所有事件都在触发。
但遗憾的是,首次通话后,TAPI完全忽略了所有后续通话,
在我重新启动应用程序之前没有事件触发。
我在google搜索时发现的一件事,如果我重置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 :(得分:1)
这对你来说很好....:
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;
}
}
这是因为在第一次呼叫时你的呼叫状态是空闲的,持续时间不到几毫秒。
答案 1 :(得分:0)
您是否尝试过致电:
tobj.Shutdown();
initializetapi3();
收到TAPI3Lib.CALL_STATE.CS_DISCONNECTED事件后(或任何事件发生后)? 所以,例如:
case TAPI3Lib.CALL_STATE.CS_DISCONNECTED:
status("Disconnected");
tobj.Shutdown();
initializetapi3();
break;
答案 2 :(得分:0)
解决方案是等到tapi callstate断开连接事件,并且一旦发生这种情况:
a)UnRegisterDeviceForEvents与disconnect事件关联的设备地址,然后
b)RegisterCallNotifications与断开连接事件关联的设备地址
答案 3 :(得分:0)
对于这个问题,我使用了由Julmar编写的Tapi的托管C#包装器,可以是downloaded, 通过使用此样本,传入呼叫也可以以.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());
}
}
}