⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mytapi.c

📁 本源代码介绍了怎样使用WINDOWS API函数直接编写MODEM通讯程序。
💻 C
字号:
#include <windows.h>
#include <memory.h>
#include "comdial.h"
#include "resource.h"

#define MAXDSZ (256)

MYTAPI mytapi;
HWND ghWnd;
HINSTANCE ghInst;

DWORD WINAPI ReadThread(LPVOID lpParams);

LRESULT CALLBACK DialDlgProc(HWND hDlg,UINT uMessage,
							 UINT uParam,LONG lParam)
{
	char szBuf[MAXDSZ];
	static char szCurArea[16],szCurCountry[16];
	static BOOL bCountryCodeUsed=FALSE;
	static BOOL bAreaCodeUsed=FALSE;

	switch (uMessage) {
	case WM_COMMAND:
		switch (LOWORD(uParam)) {
		case IDC_CHECK_COUNTRYCODE:
			if (bCountryCodeUsed) {
				bCountryCodeUsed=FALSE;
				CheckDlgButton(hDlg,IDC_CHECK_COUNTRYCODE,BST_UNCHECKED);
				EnableWindow(GetDlgItem(hDlg,IDC_COUNTRYCODE),FALSE);
			} else {
				bCountryCodeUsed=TRUE;
				CheckDlgButton(hDlg,IDC_CHECK_COUNTRYCODE,BST_CHECKED);
				EnableWindow(GetDlgItem(hDlg,IDC_COUNTRYCODE),TRUE);
			}
			break;
		case IDC_CHECK_AREACODE:
			if (bAreaCodeUsed) {
				bAreaCodeUsed=FALSE;
				CheckDlgButton(hDlg,IDC_CHECK_AREACODE,BST_UNCHECKED);
				EnableWindow(GetDlgItem(hDlg,IDC_AREACODE),FALSE);
			} else {
				bAreaCodeUsed=TRUE;
				CheckDlgButton(hDlg,IDC_CHECK_AREACODE,BST_CHECKED);
				EnableWindow(GetDlgItem(hDlg,IDC_AREACODE),TRUE);
			}
			break;
		case IDOK:
			mytapi.szDialNumber[0]='+';
			mytapi.szDialNumber[1]=0;

//			if (bCountryCodeUsed) {
				GetDlgItemText(hDlg,IDC_COUNTRYCODE,szBuf,MAXDSZ-1);
				MakeLettersIntoDigits(szBuf);
				lstrcat(mytapi.szDialNumber,szBuf);
//			}
//			if (bAreaCodeUsed) {
				GetDlgItemText(hDlg,IDC_AREACODE,szBuf,MAXDSZ-1);
				MakeLettersIntoDigits(szBuf);
				lstrcat(mytapi.szDialNumber," (");
				lstrcat(mytapi.szDialNumber,szBuf);
				lstrcat(mytapi.szDialNumber,") ");
//			}
			GetDlgItemText(hDlg,IDC_PHONENUMBER,szBuf,MAXDSZ-1);
			MakeLettersIntoDigits(szBuf);
			lstrcat(mytapi.szDialNumber,szBuf);

			EndDialog(hDlg,TRUE);
			return TRUE;
		case IDCANCEL:
			EndDialog(hDlg,FALSE);
			return TRUE;
		default: break;
		}
		break;
	case WM_INITDIALOG:
		tapiGetLocationInfo(szCurCountry,szCurArea);
		SetDlgItemText(hDlg,IDC_COUNTRYCODE,szCurCountry);
		SetDlgItemText(hDlg,IDC_AREACODE,szCurArea);
		bCountryCodeUsed=FALSE;
		CheckDlgButton(hDlg,IDC_CHECK_COUNTRYCODE,BST_UNCHECKED);
		EnableWindow(GetDlgItem(hDlg,IDC_COUNTRYCODE),FALSE);
		bAreaCodeUsed=FALSE;
		CheckDlgButton(hDlg,IDC_CHECK_AREACODE,BST_UNCHECKED);
		EnableWindow(GetDlgItem(hDlg,IDC_AREACODE),FALSE);
		break;
	default:break;
	}
	return FALSE;
}



LRESULT CALLBACK MainProc(HWND hDlg,UINT uMessage,
						  UINT uParam,LONG lParam)
{
	LONG lResult;
	HMENU hMenu;

	switch (uMessage) {
	case WM_INITDIALOG:
		ghWnd=hDlg;
		hMenu=LoadMenu(ghInst,"MyTAPI");
		memset(&mytapi,0,sizeof(MYTAPI));
		break;
	case WM_COMMAND:
		switch (LOWORD(uParam)) {
		case IDM_EXIT:
			if (mytapi.bInitialized) telephonyShutdown();
			EndDialog(hDlg,FALSE);
			break;
		case IDM_MAKECALL:
		{
//			char szTemp[60];
			LPLINETRANSLATEOUTPUT plto;
			LINECALLPARAMS *pCallParams;
			if (!mytapi.bLineOpen) {
				if (telephonyOpen(hDlg,ghInst)) {
					myMessageBox("Error opening line");
					break;
				}
			}
			if (!(mytapi.pLineAddressStatus->dwAddressFeatures
					& LINEADDRFEATURE_MAKECALL)) 
			{
				myMessageBox("Line/address does not support lineMakeCall");
				break;
			}
			if (!DialogBox(ghInst,"DialDialog",hDlg,(DLGPROC)DialDlgProc)) break;
/*			if (mytapi.szDialNumber[0]!='+') {
				szTemp[0]='+';
				lstrcpy(&szTemp[1],mytapi.szDialNumber);
				lstrcpy(mytapi.szDialNumber,szTemp);
			}
*/			lResult=lineTranslateDialog(mytapi.hTAPI,mytapi.dwLine,
						mytapi.dwVersionToUse,hDlg,mytapi.szDialNumber);
			if (lResult) {
				ProcessTAPIError(lResult);
				myMessageBox("Error translating address");
				break;
			}
			plto=(LINETRANSLATEOUTPUT *)calloc(1,sizeof(LINETRANSLATEOUTPUT)+5000);
			plto->dwTotalSize=sizeof(LINETRANSLATEOUTPUT)+5000;
			lResult=lineTranslateAddress(mytapi.hTAPI,mytapi.dwLine,
						mytapi.dwVersionToUse,mytapi.szDialNumber,0,0,plto);
			if (lResult) {
				ProcessTAPIError(lResult);
				myMessageBox("Error translating address");
				free(plto);
				break;
			} else {
				memcpy(mytapi.szDialNumber,
					(LPSTR)((DWORD)plto+plto->dwDialableStringOffset),
					plto->dwDialableStringSize);
				mytapi.szDialNumber[plto->dwDialableStringSize]=0;
			}
			free(plto);
			pCallParams=(LINECALLPARAMS *)calloc(1,sizeof(LINECALLPARAMS));
			pCallParams->dwTotalSize=sizeof(LINECALLPARAMS);
			pCallParams->dwBearerMode=LINEBEARERMODE_VOICE;
			pCallParams->dwMediaMode=LINEMEDIAMODE_DATAMODEM;
			pCallParams->dwCallParamFlags=LINECALLPARAMFLAGS_IDLE;
			pCallParams->dwAddressMode=LINEADDRESSMODE_ADDRESSID;
			lResult=lineMakeCall(mytapi.hLine,
				&mytapi.hCall,mytapi.szDialNumber,0,pCallParams);
			if (!(lResult>0)) {
				ProcessTAPIError(lResult);
				myMessageBox("Error making Call");
				free(pCallParams);
				break;
			}
			free(pCallParams);
			hMenu=GetMenu(hDlg);
			EnableMenuItem(hMenu,
				IDM_DISCONNECT,MF_ENABLED|MF_BYCOMMAND);
			break;
		}
		case IDM_ANSWER:
			if (mytapi.bWaitForCall) {
				mytapi.bWaitForCall=FALSE;
				CheckMenuItem(GetMenu(hDlg),IDM_ANSWER,MF_UNCHECKED);
			} else {
				if (!mytapi.bLineOpen) {
					if (telephonyOpen(hDlg,ghInst)) {
						myMessageBox("Error opening line");
						break;
					}
				}
				mytapi.bWaitForCall=TRUE;
				CheckMenuItem(GetMenu(hDlg),IDM_ANSWER,MF_CHECKED);
			}
			break;
		case IDM_DISCONNECT:
			lResult=lineDrop(mytapi.hCall,NULL,0);
			if (!(lResult>0)) {
				ProcessTAPIError(lResult);
				myMessageBox("Error dropping call");
			}
			hMenu=GetMenu(hDlg);
			EnableMenuItem(hMenu,IDM_DISCONNECT,
				MF_GRAYED|MF_DISABLED|MF_BYCOMMAND);
			EnableMenuItem(hMenu,IDM_MAKECALL,
				MF_GRAYED|MF_DISABLED|MF_BYCOMMAND);
			EnableMenuItem(hMenu,IDM_ANSWER,
				MF_GRAYED|MF_DISABLED|MF_BYCOMMAND);
			break;
		case IDM_CONFIGUREMODEM:
			if (!mytapi.bInitialized) {
				if (telephonyInitialize(hDlg,ghInst)) {
					myMessageBox("Error initializing");
					break;
				}
				hMenu=GetMenu(hDlg);
				EnableMenuItem(hMenu,IDM_DISCONNECT,
					MF_GRAYED|MF_DISABLED|MF_BYCOMMAND);
				EnableMenuItem(hMenu,
					IDM_MAKECALL,MF_ENABLED|MF_BYCOMMAND);
				EnableMenuItem(hMenu,
					IDM_ANSWER,MF_ENABLED|MF_BYCOMMAND);
			}
			lResult=telephonySettings(hDlg);
			if (lResult) {
				ProcessTAPIError(lResult);
				myMessageBox("Error configuring modem");
			}
			if (!mytapi.bLineOpen) {
				if (telephonyOpen(hDlg,ghInst)) {
					myMessageBox("Error opening line");
					break;
				}
			}
			mytapi.bWaitForCall=TRUE;
			break;
		}
		break;
	}
	return 0;
}



int WINAPI WinMain(HINSTANCE hInstance,
				   HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine,
				   int nCmdShow)
{
	ghInst=hInstance;
	return DialogBox(ghInst,"MyTAPI",NULL,(DLGPROC)MainProc);
}

DWORD WINAPI ReadThread(LPVOID lpParams)
{
	return 1998;
}

void MakeLettersIntoDigits(LPSTR sDial)
{
	int i,isz=lstrlen(sDial);

	for (i=0;i<isz;i++) {
		switch (sDial[i]) {
		case 'A':
		case 'B':
		case 'C':
		case 'a':
		case 'b':
		case 'c':
			sDial[i]='2';
			break;
		case 'D':
		case 'E':
		case 'F':
		case 'd':
		case 'e':
		case 'f':
			sDial[i]='3';
			break;
		case 'G':
		case 'H':
		case 'I':
		case 'g':
		case 'h':
		case 'i':
			sDial[i]='4';
			break;
		case 'J':
		case 'K':
		case 'L':
		case 'j':
		case 'k':
		case 'l':
			sDial[i]='5';
			break;
		case 'M':
		case 'N':
		case 'O':
		case 'm':
		case 'n':
		case 'o':
			sDial[i]='6';
			break;
		case 'P':
		case 'R':
		case 'S':
		case 'p':
		case 'r':
		case 's':
			sDial[i]='7';
			break;
		case 'T':
		case 'U':
		case 'V':
		case 't':
		case 'u':
		case 'v':
			sDial[i]='8';
			break;
		case 'W':
		case 'X':
		case 'Y':
		case 'w':
		case 'x':
		case 'y':
			sDial[i]='9';
			break;
		case 'Z':
		case 'Q':
		case 'z':
		case 'q':
			sDial[i]='1';
			break;
		default: break;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -