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

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

?? tapieventprocess.cpp

?? 用VC++編的電話自動應答系統,由系統自動處理用戶的呼叫,通過語音給出用戶的各種操作提示,并根據用戶的操作來執行相應的命令
?? 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接口中的唯一的方法,當有事件被觸發時,
// TAPI 3.0 就會調用這個函數。
// 2、這個函數里僅僅向用戶界面線程(在本程序中可以理解為主對話框)發送一個消息,
// 這樣做的目的是在 TAPI 的 回調(callback)線程中包含盡量少的處理過程
//
///////////////////////////////////////////////////////////////////

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

    //
    // 向 UI 線程發送消息
    //

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

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

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

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

        m_pTapi->Release();
        m_pTapi = NULL;

        return hr;
    }

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

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

    hr = RegisterTapiEventInterface(pTAPIEventNotification);

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

	OSVERSIONINFOEX osvi;
	BOOL bOsVersionInfoEx;

	//
	// 因為 TE_FILETERMINAL 只有在 Windows XP 下才支持,因此這里需要先判斷操作系統的版本
	// 如果在 Windows XP 以下注冊 TE_FILETERMINAL 消息時,這是 TAPI 將無法接受到任何消息!
	//
	// 獲取操作系統版本,使用到結構體 OSVERSIONINFOEX 
	// 如果調用失敗,再嘗試用 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)
	{
      // 獲得操作系統版本,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("您的操作系統版本太低,本系統至少要求在 Win2000 環境下");
		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("注冊消息失敗,系統無法接收到任何消息,但可以對其它號碼呼叫");
	}

    //
    // 查找我們需的的 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();
	
    //
	// 調用 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,
// 如果都支持,則調用 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 狀態是否啟用
	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 狀態
		CString strName;		//當前 Address 名稱的 ASSIC 表示

		//
		// 獲得當前 Address 名稱,并判斷是否為 Modem 所有,如果不是,結束本次循環,遍歷一下 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目前處于啟用狀態
		//
		bState = TRUE;

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

			if( SUCCEEDED(hr) )
			{
				//
				// 找到一個 Modem 設備,并且監聽成功,退出函數
				// 檢測當前 Address 能力,是否支持監視所有種類形式的按鍵
				//
		        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("系統監測到您機器內有Modem,但當前沒又啟用,請手工啟用Modem之后在運行本程序");
		return E_FAIL;
	}
	if( !bListen )
	{
		AfxMessageBox("使用Modem監聽失敗,可能是您的 Modem 不支持語音,詳情請于服務商聯系");
		return E_FAIL;
	}
    return S_OK;
}

///////////////////////////////////////////////////////////////////
// ListenOnThisAddress
//
// 功能:在調用這個函數之前,我們已經對所希望處理的事件進行了過濾設置,
// 這里通過調用 RegisterCallNotifications 告訴 TAPI 我們將要在這個
// Address 上觸發那些已經設置的事件
//
///////////////////////////////////////////////////////////////////
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一区二区三区免费野_久草精品视频
天天操天天干天天综合网| 日韩国产精品91| 午夜视频一区二区| 国产精品亚洲午夜一区二区三区 | 成人在线综合网| 欧美吞精做爰啪啪高潮| 中文一区二区在线观看| 蜜臀国产一区二区三区在线播放 | 久久精品久久99精品久久| 国产一区二区在线观看免费| 欧洲一区二区av| 中文字幕精品—区二区四季| 免费观看日韩av| 精品视频一区二区三区免费| 亚洲欧洲国产日韩| 国产成人精品1024| 久久亚洲二区三区| 日本不卡1234视频| 欧美精三区欧美精三区| 亚洲免费看黄网站| 91性感美女视频| 国产精品二区一区二区aⅴ污介绍| 黄网站免费久久| 欧美videos中文字幕| 日韩电影在线看| 日韩一区二区高清| 日韩黄色小视频| 久久精品亚洲麻豆av一区二区| 亚洲欧美日本在线| 岛国精品在线播放| 国产三级三级三级精品8ⅰ区| 久久99国内精品| 欧美大胆人体bbbb| 狠狠色综合色综合网络| 欧美大尺度电影在线| 国产在线精品一区二区三区不卡| 91精品国产乱码| 美女在线视频一区| 精品国产乱码久久久久久图片| 免费看欧美美女黄的网站| 日韩欧美成人激情| 国产不卡一区视频| 中文字幕一区二区日韩精品绯色| av毛片久久久久**hd| 亚洲欧美一区二区不卡| 欧美少妇xxx| 日韩电影免费在线观看网站| 日韩免费在线观看| 中文乱码免费一区二区| 麻豆91在线看| 国产日产亚洲精品系列| 97精品电影院| 午夜成人免费电影| 久久老女人爱爱| 不卡视频一二三四| 亚洲成人第一页| 日韩美女在线视频| 波多野洁衣一区| 亚洲成人7777| 久久精品欧美一区二区三区不卡| 成人免费电影视频| 午夜精品福利一区二区三区蜜桃| 日韩免费性生活视频播放| 国产.欧美.日韩| 午夜私人影院久久久久| 精品国产伦理网| 在线免费视频一区二区| 免费高清不卡av| 国产精品久久久久影院| 欧美日韩第一区日日骚| 国产成人免费视频精品含羞草妖精 | 日韩午夜激情视频| 视频一区视频二区中文| 久久久综合精品| 欧美亚洲一区二区在线| 国产精品一区二区果冻传媒| 一区二区三区影院| 久久久久久日产精品| 欧美在线免费视屏| 国产91清纯白嫩初高中在线观看| 亚洲国产精品一区二区www在线| 久久欧美中文字幕| 在线不卡a资源高清| 99久久婷婷国产综合精品| 免费av网站大全久久| 综合色天天鬼久久鬼色| 欧美mv日韩mv国产| 一本久久a久久免费精品不卡| 国产一区二区三区综合| 日韩精品一二三四| 一区二区三区视频在线看| 亚洲国产激情av| 欧美大片国产精品| 99精品视频中文字幕| 久久se这里有精品| 亚洲v中文字幕| 亚洲日本免费电影| 国产欧美日韩久久| xf在线a精品一区二区视频网站| 欧美日韩一卡二卡三卡| 欧美在线观看视频在线| 色综合久久中文字幕| 成人精品视频.| 国产91精品免费| 国产高清精品久久久久| 国产一区二区三区av电影| 人人狠狠综合久久亚洲| 日韩精品一二三| 青青草国产成人av片免费| 午夜电影网一区| 偷拍日韩校园综合在线| 丝袜美腿一区二区三区| 午夜精品影院在线观看| 亚洲地区一二三色| 婷婷亚洲久悠悠色悠在线播放 | 亚洲国产成人porn| 亚洲国产精品影院| 日韩精品1区2区3区| 欧美a一区二区| 六月婷婷色综合| 六月丁香婷婷久久| 国产精品一二三区| 成人午夜在线视频| www.日韩精品| 欧美在线三级电影| 91精品一区二区三区在线观看| 91麻豆精品国产自产在线观看一区| 欧美日韩aaa| 精品国产乱码久久久久久牛牛 | 香蕉成人伊视频在线观看| 亚洲国产综合在线| 秋霞电影网一区二区| 蜜桃视频一区二区三区在线观看| 美女精品自拍一二三四| 成人综合在线网站| 色94色欧美sute亚洲线路一ni| 欧美日韩极品在线观看一区| 日韩亚洲欧美一区二区三区| 国产日韩精品一区| 亚洲黄色免费电影| 青娱乐精品视频| 成人教育av在线| 欧美无砖专区一中文字| 日韩欧美美女一区二区三区| 国产精品三级av| 午夜精品福利一区二区三区蜜桃| 久久99精品久久久久| 91欧美激情一区二区三区成人| 欧美日韩视频在线观看一区二区三区| 日韩视频中午一区| 国产精品美女久久久久久| 香蕉加勒比综合久久 | 精品亚洲成a人在线观看| 国产69精品一区二区亚洲孕妇 | 午夜激情久久久| 国产69精品久久99不卡| 欧美精品久久久久久久多人混战 | 久久夜色精品国产噜噜av| 亚洲欧美区自拍先锋| 久久99久久久久| 91麻豆精品在线观看| 欧美一区二区成人6969| 亚洲黄色小视频| 国产成人综合网站| 欧美日韩免费电影| **性色生活片久久毛片| 激情综合色综合久久综合| 欧美视频一区二区三区| 亚洲国产精品精华液ab| 欧美aaaaaa午夜精品| 色婷婷久久综合| 中文幕一区二区三区久久蜜桃| 日韩va欧美va亚洲va久久| 色综合久久99| 中文字幕高清不卡| 免费av成人在线| 欧美日韩精品一二三区| 亚洲精品免费电影| 成人免费视频网站在线观看| 日韩免费电影网站| 首页国产欧美久久| 欧美视频日韩视频| 亚洲激情在线激情| www.性欧美| 国产精品国产精品国产专区不片| 狠狠久久亚洲欧美| 欧美一区二区三区精品| 手机精品视频在线观看| 欧美日韩在线直播| 亚洲福利国产精品| 欧美亚洲一区二区在线| 亚洲人成7777| 色网综合在线观看| 亚洲三级免费电影| 一本一道综合狠狠老| 亚洲欧美视频在线观看视频| 色综合久久久久综合| 亚洲在线免费播放| 欧美亚洲精品一区| 三级不卡在线观看|