📄 mytapi.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 + -