亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tapieventprocess.cpp

?? 用VC編寫的電話自動應答系統(tǒng)
?? CPP
?? 第 1 頁 / 共 3 頁
字號:

#include "StdAfx.h"
#include <tapi3.h>

#include "tapieventprocess.h"


const int Ver_Win2000 = 1;
const int Ver_WinXP = 2;
const int Timer_ID = 1;
const int Max_Rec_Time = 60000;
const DWORD ADDRESSLENGTH   = 128;



///////////////////////////////////////////////////////////////////
// CallEventNotification::Event
//
// 1、這是ITCallEventNotification接口中的唯一的方法,當有事件被觸發(fā)時,
// TAPI 3.0 就會調(diào)用這個函數(shù)。
// 2、這個函數(shù)里僅僅向用戶界面線程(在本程序中可以理解為主對話框)發(fā)送一個消息,
// 這樣做的目的是在 TAPI 的 回調(diào)(callback)線程中包含盡量少的處理過程
//
///////////////////////////////////////////////////////////////////

HRESULT
STDMETHODCALLTYPE
CTAPIEventNotification::Event(
                              TAPI_EVENT TapiEvent,
                              IDispatch * pEvent
                             )
{
    //
    // 調(diào)用AddRef,計數(shù)器加1.
    //
    pEvent->AddRef();

    //
    // 向 UI 線程發(fā)送消息
    //

    PostMessage(
                m_hWnd,
                WM_PRIVATETAPIEVENT,
                (WPARAM) TapiEvent,
                (LPARAM) pEvent
               );

    return S_OK;
}
/*
void CTAPIEventNotification::gg()
{
    PostMessage(
                m_hWnd,
                WM_PRIVATETAPIEVENT,
                0,
                0
               );
}
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////
//
// calss CTapi 實現(xiàn)代碼
//
// 說明:
//		1. 本類基于 TAPI3.1, 對 TAPI 的功能進行定制,滿足特定需要
// 功能:
//		1. 對給定的電話號碼呼叫
//		2. 當有電話呼入時,給對方播放本地事先指定的聲音文件
//		3. 接受電話另一方的按鍵,分別對不同按鍵作出響應
//		4. 具有來錄音功能
// 注意:
//		1. 對 CTapi 類初始化時需要傳入當前 UI(用戶界面)的句柄,通過這個句柄向 UI 線程發(fā)送消息,在 UI
//		   線程中對 TAPI EVENT 進行響應。
//		2. 需要 class CTAPIEventNotification 輔助,完成對事件的注冊
//////////////////////////////////////////////////////////////////////////////////////////////////////

CTapi::CTapi()
{
	m_pTapi = NULL;
	m_pAddress = NULL;
	m_pCall = NULL;
	m_AutoAnswer = false;
	m_pPlayFileTerm = NULL;
	m_pRecordFileTerm = NULL;
	m_Advise = 0;
	m_hWnd = 0;
	m_dwMessages = 0;
	m_Version = 0;

	m_WelcomeFileName = "Welcome.wav";
	m_RecFileName = "Message";
	m_RecFileExt = "avi";
}

CTapi::~CTapi()
{

}

//////////////////////////////////////////////////////////////
// InitializeTapi
//
// TAPI 初始化
///////////////////////////////////////////////////////////////
HRESULT CTapi::InitializeTapi()
{
    HRESULT         hr;

    //
    // 初始化 TAPI object
    //
    hr = CoCreateInstance(
                          CLSID_TAPI,
                          NULL,
                          CLSCTX_INPROC_SERVER,
                          IID_ITTAPI,
                          (LPVOID *)&m_pTapi
                         );

    if ( FAILED(hr) )
    {
        AfxMessageBox("初始化 TAPI 失敗!");
        return hr;
    }

    //
    // 調(diào)用 initialize.  
	// 本函數(shù)必須在其它所有 TAPI 函數(shù)被調(diào)用之前調(diào)用
    //
    hr = m_pTapi->Initialize();

    if ( FAILED(hr) )
    {
        AfxMessageBox("初始化 TAPI 失敗!");

        m_pTapi->Release();
        m_pTapi = NULL;

        return hr;
    }

    //
    // 創(chuàng)建我們自己的事件處理實例并注冊之,參見 CTAPIEventNodtification 的定義
    //
    CTAPIEventNotification *pTAPIEventNotification = new CTAPIEventNotification;

	//
	//將 CTapi中的窗口句柄傳給 CTAPIEventNotification,由 CTAPIEventNotification 向UI進程發(fā)送消息
	//
	pTAPIEventNotification->m_hWnd = m_hWnd;

    hr = RegisterTapiEventInterface(pTAPIEventNotification);

    //
	// 這里已經(jīng)不再需要 CALLBACK 對象,因為 TAPI 本身會在其內(nèi)部創(chuàng)建并保留這個對象
    //
    pTAPIEventNotification->Release();

	OSVERSIONINFOEX osvi;
	BOOL bOsVersionInfoEx;

	//
	// 因為 TE_FILETERMINAL 只有在 Windows XP 下才支持,因此這里需要先判斷操作系統(tǒng)的版本
	// 如果在 Windows XP 以下注冊 TE_FILETERMINAL 消息時,這是 TAPI 將無法接受到任何消息!
	//
	// 獲取操作系統(tǒng)版本,使用到結構體 OSVERSIONINFOEX 
	// 如果調(diào)用失敗,再嘗試用 OSVERSIONINFO 
	//

	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

	if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
	{
		// 如果使用 OSVERSIONINFOEX 失敗, 嘗試 OSVERSIONINFO.

		osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
		if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
			return FALSE;
	}

	if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
	{
      // 獲得操作系統(tǒng)版本,Win2000以下忽略

         if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
		 {
			 // Windows 2000
			 m_Version = Ver_Win2000;
		 }

         if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
		 {
			 // Windows XP
			 m_Version = Ver_WinXP;
		 }
	}
	else
	{
		AfxMessageBox("您的操作系統(tǒng)版本太低,本系統(tǒng)至少要求在 Win2000 環(huán)境下");
		return E_FAIL;
	}
	//
	// 對我們所希望處理的事件設置事件進行事件過濾設置
	//
    if(m_Version == Ver_Win2000)
	{
		hr = m_pTapi->put_EventFilter(TE_CALLNOTIFICATION | 
							TE_CALLSTATE  | 
							TE_CALLMEDIA  | 
							TE_DIGITEVENT );
	}
	else if(m_Version == Ver_WinXP)
	{
		hr = m_pTapi->put_EventFilter(TE_CALLNOTIFICATION | 
							TE_CALLSTATE  | 
							TE_CALLMEDIA  | 
							TE_DIGITEVENT |
							TE_FILETERMINAL);	// TE_FILETERMINAL 只有在 WinXP 下才支持
	}
	
	if( FAILED(hr) )
	{
		AfxMessageBox("注冊消息失敗,系統(tǒng)無法接收到任何消息,但可以對其它號碼呼叫");
	}

    //
    // 查找我們需的的 Address (本程序中為 Modem)并在其上開始偵聽
    //
    hr = ListenOnAddresses();

    if ( FAILED(hr) )
    {
		//
		//如果失敗,釋放所之前所審請的資源
		//在 ListenOnAddresses 中已有錯誤信息輸出,此處不需要再次輸出 Errmsg
		//
        m_pTapi->Release();
        m_pTapi = NULL;

        return hr;
    }
    return S_OK;
}


///////////////////////////////////////////////////////////////
// ShutdownTapi
//
// 功能:關閉 Tapi
///////////////////////////////////////////////////////////////
void CTapi::ShutdownTapi()
{
    //
    // 如果仍有一個 Call 存在的話,則掛斷并釋放之
    //
    DisconnectTheCall();

    ReleaseTheCall();
	
    //
	// 調(diào)用 Sleep 目的是為了留出一段時間讓 TAPI 來掛斷電話。
	// 因為對話框雖然會立即消失,但 TAPI 進程仍有可能未結束
	// 
    Sleep(5000);

	//
    // 釋放主要的對象
    //
    if (NULL != m_pTapi)
    {
        m_pTapi->Shutdown();
        m_pTapi->Release();
    }
}

///////////////////////////////////////////////////////////////////////////
// RegisterTapiEventInterface
//
// 功能:注冊 Tapi 事件接口
///////////////////////////////////////////////////////////////////////////
HRESULT CTapi::RegisterTapiEventInterface(CTAPIEventNotification *pTAPIEventNotification)
{
    HRESULT                       hr = S_OK;
    IConnectionPointContainer   * pCPC;
    IConnectionPoint            * pCP;

    //
	// 獲得連接點容器
	//
    hr = m_pTapi->QueryInterface(
                                IID_IConnectionPointContainer,
                                (void **)&pCPC
                               );

    if ( FAILED(hr) )
    {
        return hr;
    }

    //
	// 獲得連接點
	//
	hr = pCPC->FindConnectionPoint(
                                   IID_ITTAPIEventNotification,
                                   &pCP
                                  );

    pCPC->Release();

    if ( FAILED(hr) )
    {
        return hr;
    }

	// m_Advise 用于取消注冊之用
    hr = pCP->Advise(
                      pTAPIEventNotification,
                      &m_Advise
                     );

    pCP->Release();

    return hr;
}


//////////////////////////////////////////////////////////////
// AddressSupportsMediaType
//
// 功能:驗證給定的 Address 是否支持 給定的 MediaType
// 返回:TRUE——支持;FALSE——不支持
//////////////////////////////////////////////////////////////
BOOL CTapi::AddressSupportsMediaType(
							ITAddress * pAddress,
							long        lMediaType
							)
{
    VARIANT_BOOL     bSupport = VARIANT_FALSE;
    ITMediaSupport * pMediaSupport;
  
    if ( SUCCEEDED( pAddress->QueryInterface( IID_ITMediaSupport,
                                              (void **)&pMediaSupport ) ) )
    {
        //
        // 通過 pMediaSupport 驗證 pAddress 是否支持 lMediaType
        //
        pMediaSupport->QueryMediaType(
                                      lMediaType,
                                      &bSupport
                                     );

        pMediaSupport->Release();
    }

    return (bSupport == VARIANT_TRUE);
}



////////////////////////////////////////////////////////////////////////
// ListenOnAddresses
//
// 功能:找到 Modem 所在的 Address,判斷是否支持 AudioIn and AudioOut,
// 如果都支持,則調(diào)用 ListenOnThisAddress 開始在此 Address 上偵聽
////////////////////////////////////////////////////////////////////////
HRESULT CTapi::ListenOnAddresses()
{
    HRESULT             hr = S_OK;
    IEnumAddress *      pEnumAddress;
    ITAddress *         pAddress;

    //
    // 列舉所有的 Address
    //
    hr = m_pTapi->EnumerateAddresses( &pEnumAddress );

    if ( FAILED(hr) )
    {
        return hr;
    }

	BOOL bModem;	//當前 Address 是否為 Modem 所有
	BOOL bState;	//當前 Address 狀態(tài)是否啟用
	BOOL bListen;	//當前 Address 上偵聽是否成功

    while ( TRUE )
    {
        //
        // 獲得下一個 Address
        //
        bModem = bState = bListen = FALSE;

		hr = pEnumAddress->Next( 1, &pAddress, NULL );

        if (S_OK != hr)
        {
            break;
        }

		BSTR bstrName;			//當前 Address 名稱
		ADDRESS_STATE state;	//當前 Address 狀態(tài)
		CString strName;		//當前 Address 名稱的 ASSIC 表示

		//
		// 獲得當前 Address 名稱,并判斷是否為 Modem 所有,如果不是,結束本次循環(huán),遍歷一下 Address
		//
		pAddress->get_AddressName(&bstrName);
		strName = bstrName;
		SysFreeString(bstrName);
		strName.MakeLower();

		if( strName.Find("modem") == -1 )
			continue;
		//
		//找到了modem
		//
		bModem = TRUE;

		pAddress->get_State( &state);
		if( state != AS_INSERVICE)
			continue;
		//
		//上面找到的Modem目前處于啟用狀態(tài)
		//
		bState = TRUE;

        //
		// 當前 Address 是否支持聲音
		if ( AddressSupportsMediaType(pAddress, TAPIMEDIATYPE_AUDIO) )
        {
            //
            // 如果支持聲音,開始偵聽
            //
            hr = ListenOnThisAddress( pAddress );

			if( SUCCEEDED(hr) )
			{
				//
				// 找到一個 Modem 設備,并且監(jiān)聽成功,退出函數(shù)
				// 檢測當前 Address 能力,是否支持監(jiān)視所有種類形式的按鍵
				//
		        ITAddressCapabilities *pAddressCaps = NULL;
			    long                    lType = 0;
				hr = pAddress->QueryInterface(IID_ITAddressCapabilities, (void**)&pAddressCaps);

				if ( SUCCEEDED(hr) )
				{

					hr = pAddressCaps->get_AddressCapability( AC_MONITORDIGITSUPPORT, &lType );
					if( SUCCEEDED(hr) )
					{
						if( !(lType & LINEDIGITMODE_DTMF) ) //LINEDIGITMODE_DTMFEND
							AfxMessageBox("您的 Modem 不支持音頻撥號檢測功能,無法獲得音頻撥號的電話機的按鍵");
						else if( !(lType & LINEDIGITMODE_PULSE) )
							AfxMessageBox("您的 Modem 不支持脈沖撥號檢測功能,無法獲得脈沖撥號的電話機的按鍵");
					}

					pAddressCaps->Release();

					m_pAddress = pAddress;
					pAddress->Release();
					pEnumAddress->Release();
					return S_OK;
				}
			}
        }

        pAddress->Release();
    }
	
    pEnumAddress->Release();

	//
	// 以下為對應的錯誤信息提示
	//
	if( !bModem )
	{
		AfxMessageBox("沒有找到Modem,請檢查您計算機那是否裝有Modem");
		return E_FAIL;
	}
	if( !bState )
	{
		AfxMessageBox("系統(tǒng)監(jiān)測到您機器內(nèi)有Modem,但當前沒又啟用,請手工啟用Modem之后在運行本程序");
		return E_FAIL;
	}
	if( !bListen )
	{
		AfxMessageBox("使用Modem監(jiān)聽失敗,可能是您的 Modem 不支持語音,詳情請于服務商聯(lián)系");
		return E_FAIL;
	}
    return S_OK;
}

///////////////////////////////////////////////////////////////////
// ListenOnThisAddress
//
// 功能:在調(diào)用這個函數(shù)之前,我們已經(jīng)對所希望處理的事件進行了過濾設置,
// 這里通過調(diào)用 RegisterCallNotifications 告訴 TAPI 我們將要在這個
// Address 上觸發(fā)那些已經(jīng)設置的事件
//
///////////////////////////////////////////////////////////////////
HRESULT CTapi::ListenOnThisAddress(
						ITAddress * pAddress
					)
{
    long lMediaTypes = TAPIMEDIATYPE_AUDIO;

    if ( AddressSupportsMediaType(pAddress, TAPIMEDIATYPE_VIDEO) )
    {
        lMediaTypes |= TAPIMEDIATYPE_VIDEO;
    }

    HRESULT  hr;
    long     lRegister;

    hr = m_pTapi->RegisterCallNotifications(
                                           pAddress,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
激情综合网av| 天天综合天天做天天综合| 国产白丝精品91爽爽久久| 久久综合九色综合97婷婷女人| 免费欧美高清视频| 精品国产一区二区在线观看| 国产精品资源网站| 国产精品剧情在线亚洲| 91国偷自产一区二区开放时间 | 亚洲久草在线视频| 欧美性生活久久| 蜜臀av国产精品久久久久| 精品少妇一区二区三区免费观看 | 韩国女主播一区| 国产欧美一区在线| 91久久精品一区二区二区| 日韩福利电影在线| 国产亚洲成年网址在线观看| 99精品欧美一区二区三区综合在线| 亚洲自拍偷拍网站| 久久久久久久久蜜桃| 91免费国产在线观看| 美美哒免费高清在线观看视频一区二区| 亚洲精品一区二区三区蜜桃下载 | 91精品国产91久久综合桃花| 国产精品99久久久久久有的能看| 亚洲男人的天堂在线观看| 欧美一区二视频| 97久久超碰国产精品| 日本不卡视频在线| 亚洲欧洲av一区二区三区久久| 在线播放国产精品二区一二区四区| 精品一区二区免费视频| 亚洲激情在线播放| 久久久久久97三级| 宅男噜噜噜66一区二区66| 成人午夜视频福利| 美女www一区二区| 亚洲综合在线第一页| 久久精品人人做人人综合| 欧美男男青年gay1069videost| 大胆欧美人体老妇| 美女国产一区二区| 亚洲综合清纯丝袜自拍| 国产精品视频麻豆| 欧美精品一区二区三区很污很色的 | 国产69精品久久777的优势| 天堂蜜桃一区二区三区| 国产精品剧情在线亚洲| 久久一区二区三区四区| 51精品秘密在线观看| 色综合一个色综合亚洲| 国产xxx精品视频大全| 久久9热精品视频| 午夜成人免费电影| 亚洲国产精品一区二区久久恐怖片| 国产精品女主播在线观看| 久久免费看少妇高潮| 日韩美女一区二区三区四区| 欧美日韩色一区| 欧美亚洲国产一区二区三区va| 不卡的电影网站| 国产成人av电影免费在线观看| 精品中文字幕一区二区| 秋霞成人午夜伦在线观看| 亚洲国产精品久久久久秋霞影院 | 亚洲已满18点击进入久久| 国产精品久久久久一区二区三区共| 精品国产凹凸成av人导航| 欧美一区二区三区四区高清| 欧美精品丝袜中出| 欧美高清dvd| 日韩一区二区精品在线观看| 在线播放视频一区| 日韩一区二区免费视频| 日韩视频免费直播| 日韩免费一区二区| 2014亚洲片线观看视频免费| 久久免费美女视频| 国产精品三级av| 最新热久久免费视频| 一区二区激情视频| 亚洲成av人影院| 伦理电影国产精品| 国产一区二区在线视频| 国产老肥熟一区二区三区| 国产成人精品影视| 91在线无精精品入口| 在线视频一区二区三| 欧美三级韩国三级日本一级| 欧美一区二区观看视频| 欧美r级电影在线观看| 欧美变态口味重另类| 欧美国产禁国产网站cc| 亚洲免费伊人电影| 午夜精品久久久久久久久久| 奇米色777欧美一区二区| 国产一区二区h| 91啪亚洲精品| 在线不卡中文字幕| 国产清纯在线一区二区www| 亚洲人成网站在线| 日韩电影免费在线看| 国产精品18久久久久久久久| 91视频一区二区三区| 制服.丝袜.亚洲.中文.综合| 久久精品视频在线看| 亚洲一区二区三区四区中文字幕| 日韩国产欧美三级| 成人久久视频在线观看| 欧美唯美清纯偷拍| 国产视频一区不卡| 亚洲一区精品在线| 国产一区二三区| 精品视频在线免费| 欧美韩国日本综合| 日韩国产一区二| 不卡av在线网| 91精品国产综合久久福利软件 | 日本一二三四高清不卡| 亚洲国产精品久久一线不卡| 国产综合一区二区| 在线欧美日韩精品| 久久九九99视频| 亚洲成人综合视频| 成人av在线网| 精品日韩99亚洲| 亚洲第一av色| 91美女在线观看| 久久精品一区二区| 青青草国产成人99久久| 色综合久久综合网97色综合| 久久久蜜臀国产一区二区| 午夜电影一区二区| 色哟哟亚洲精品| 国产精品乱码一区二三区小蝌蚪| 青青草国产精品亚洲专区无| 欧洲精品在线观看| 中文字幕成人在线观看| 韩国一区二区三区| 91精品国产综合久久久久| 亚洲精选一二三| av午夜精品一区二区三区| 国产亚洲一区二区在线观看| 午夜精品久久久久久不卡8050| 91蜜桃视频在线| 中文字幕色av一区二区三区| 国产精品综合视频| 久久综合久久鬼色中文字| 日韩 欧美一区二区三区| 欧美日本乱大交xxxxx| 一区二区激情视频| 在线观看一区二区精品视频| 中文字幕在线一区| 成人app网站| 中文字幕+乱码+中文字幕一区| 国产精品原创巨作av| 久久蜜臀中文字幕| 国产伦精品一区二区三区免费| 日韩一区二区三区在线视频| 日韩黄色小视频| 91精品婷婷国产综合久久性色| 亚洲一区二区av电影| 在线观看免费成人| 亚洲一区二区不卡免费| 欧美日韩国产天堂| 视频一区视频二区中文| 91精品国产综合久久小美女 | 国模娜娜一区二区三区| 日韩欧美精品三级| 国产剧情av麻豆香蕉精品| 久久奇米777| 成人动漫一区二区三区| 亚洲欧洲国产日韩| 欧美亚洲国产bt| 日韩精品一区第一页| 日韩一级片在线播放| 久久国产精品99精品国产| 精品日韩99亚洲| 大胆欧美人体老妇| 亚洲永久精品大片| 欧美一级精品大片| 国产精品69毛片高清亚洲| 中文字幕一区在线观看视频| 91免费观看在线| 日产国产欧美视频一区精品 | 欧美日韩精品一区二区三区四区| 天堂精品中文字幕在线| 欧美videofree性高清杂交| 国产一级精品在线| 亚洲视频一区二区免费在线观看| 欧洲一区二区三区免费视频| 亚洲二区视频在线| 精品国产1区2区3区| 99久久久久免费精品国产 | 亚洲欧美福利一区二区| 精品视频全国免费看| 国产一区二区在线免费观看| 亚洲少妇30p| 欧美一区二区三区日韩|