Windows Vista.NET 1.0Visual Studio .NET 2003Windows 2003.NET 1.1Windows 2000Windows XP.NET 2.0IntermediateDevVisual StudioWindows.NETVisual BasicC#
Working with TAPI 3.x from .NET






3.08/5 (47 votes)
It's about time to Use Advanced Telephony features in your code? Right!
Introduction
Here I will post a class containing the event handling part in TAPI 3.0 and VB.NET.
I will also include the full project as a download.
The code is self explaining and well commented and if you need any further information, please drop me a PM.
All comments are welcome and please vote for the article.
Here is the full commented source code in VB.NET and I will be posting more in-depth tutorials about TAPI.
Imports TAPI3Lib
Namespace VBCity.TAPI
Public Class VBTAPI
Private Const MediaAudio As Integer = 8
Private Const MediaModem As Integer = 16
Private Const MediaFax As Integer = 32
Private Const MediaVideo As Integer = 32768
Private WithEvents oTAPI As TAPI3Lib.TAPI ' will hold our TAPI object
' will hold our selected address (you can hold many addresses in an array)
Private oAddress As ITAddress
Private RegCookie As Integer
Sub New()
Try
' creating a new instance to first initialize TAPI
' before attaching the events
Dim m_TAPI As New TAPIClass
' a variable to hold supported media types for the address
Dim MediaTypes As Integer
' initializing TAPI
m_TAPI.Initialize()
' attaching event sink
oTAPI = m_TAPI
' getting rid of the private instance as we have another
' global instance (oTAPI)
m_TAPI = Nothing
Dim AddressCollection As ITCollection = oTAPI.Addresses()
' looping through address collection
For Each Address As ITAddress In AddressCollection
' checking if address is working
If Address.State = ADDRESS_STATE.AS_INSERVICE Then
' extracting media support interface from the address
Dim MediaSupport As ITMediaSupport = Address
' extracting media types supporting
MediaTypes = MediaSupport.MediaTypes
MediaSupport = Nothing ' dispose of the object
If (MediaTypes And MediaModem) = MediaModem Then
' the address is a data Modem
If (MediaTypes And MediaAudio) = MediaAudio Then
' Select the address since it supports Audio
' and is a FAX/Modem
oAddress = Address ' select this address
' show the selected address name
MsgBox("we have selected this address: " + _
oAddress.AddressName)
Exit For
End If
End If
End If
Next Address
If Not (oAddress Is Nothing) Then
' registering notifications for the selected address
RegCookie = oTAPI.RegisterCallNotifications_
(oAddress, True, False, MediaTypes, 1)
' Note: this registration can be done on
' as many addresses as you want
' we will not receive notifications unless we specify
' which type of events we are interested in
oTAPI.EventFilter = (TAPI_EVENT.TE_CALLNOTIFICATION Or _
TAPI_EVENT.TE_CALLSTATE Or TAPI_EVENT.TE_CALLINFOCHANGE)
Else
MsgBox("no address selected")
End If
Catch ex As Exception
MsgBox("Error occurred:" & vbCrLf & ex.Message, _
MsgBoxStyle.Critical, "VBCITY.VBTAPI")
End Try
' by now we are done for the initialization and registration
' and the events should fire
' Note: you must dispose of TAPI before you destroy the class
' and I will leave this for now
End Sub
Private Sub oTAPI_Event(ByVal TapiEvent As TAPI3Lib.TAPI_EVENT, _
ByVal pEvent As Object) Handles oTAPI.Event
' making a thread asynchronously process the event
Dim thAsyncCall As System.Threading.Thread
Select Case TapiEvent
Case TAPI_EVENT.TE_CALLNOTIFICATION 'Call Notification Arrived
' assigning our sub's delegate to the thread
thAsyncCall = New Threading.Thread(AddressOf CallNotificationEvent)
' passing the variable for the thread
CallNotificationObject = CType(pEvent, ITCallNotificationEvent)
' starting the thread
thAsyncCall.Start()
Case TAPI_EVENT.TE_CALLSTATE 'Call State Changes
' assigning our sub's delegate to the thread
thAsyncCall = New Threading.Thread(AddressOf CallStateEvent)
' passing the variable for the thread
CallStateObject = CType(pEvent, ITCallStateEvent)
' starting the thread
thAsyncCall.Start()
Case TAPI_EVENT.TE_CALLINFOCHANGE 'Call Info Changes
' assigning our sub's delegate to the thread
thAsyncCall = New Threading.Thread(AddressOf CallInfoEvent)
' passing the variable for the thread
CallInfoObject = CType(pEvent, ITCallInfoChangeEvent)
' starting the thread
thAsyncCall.Start()
End Select
End Sub
Private CallNotificationObject As ITCallNotificationEvent
Private Sub CallNotificationEvent()
' here we should check to see various notifications of new and ended calls
Select Case CallNotificationObject.Event
Case CALL_NOTIFICATION_EVENT.CNE_MONITOR
' the notification is for a monitored call
Case CALL_NOTIFICATION_EVENT.CNE_OWNER
' the notification is for an owned call
End Select
End Sub
Private CallStateObject As ITCallStateEvent
Private Sub CallStateEvent()
' here we should check to see call state and handle connects and disconnects
Select Case CallStateObject.State
Case CALL_STATE.CS_IDLE
Case CALL_STATE.CS_INPROGRESS
Case CALL_STATE.CS_OFFERING
' a call is offering so if you don't want it then pass it
' The code to pass the call is the following
' Dim CallControl As ITBasicCallControl = CallStateObject.Call
' CallControl.HandoffIndirect (CallStateObject.Call.CallInfoLong_
(CALLINFO_LONG.CIL_MEDIATYPESAVAILABLE)
Case CALL_STATE.CS_CONNECTED
' call is connected
Case CALL_STATE.CS_QUEUED
' call is being queued
Case CALL_STATE.CS_HOLD
' call is on hold
Case CALL_STATE.CS_DISCONNECTED
' call is disconnected
End Select
End Sub
Private CallInfoObject As ITCallInfoChangeEvent
Private Sub CallInfoEvent()
' here you can extract information from the call
' the code to extract the caller ID
' >>> put the following code in a try block and
' swallow the exception if it gives errors
Dim CallerID As String
CallerID = CallInfoObject.Call.CallInfoString_
(CALLINFO_STRING.CIS_CALLERIDNAME)
End Sub
End Class
End Namespace
History
- 7th August, 2005: Initial post