📄 comdial.c
字号:
//---------------------------------------------------------------------------
//
// Module: comdial.c
//
// Purpose:
// This sample application demonstrates communications
// in Windows 95.
//
// Description of functions:
// Descriptions are contained in the function headers.
//
//---------------------------------------------------------------------------
//
// Written by Charles Mirho.
// Copyright (c) 1996 Charles Mirho. All Rights Reserved.
//
//---------------------------------------------------------------------------
#include "tty.h"
#include "resource.h"
#include "comdial.h"
HINSTANCE ghInst; //global instance handle, for now.
HWND hTTYWnd ; //global window handle
PTTYINFO pTTYInfo;
extern MYTAPI mytapi;
#define MAXDSZ 30 //max size of dial string parts
LRESULT CALLBACK DialDialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
void MakeLettersIntoDigits (LPSTR dialstring);
#if !defined(_WIN32)
#include <ver.h>
#endif
// Windows NT defines APIENTRY, but 3.x doesn't
#if !defined (APIENTRY)
#define APIENTRY far pascal
#endif
// Windows 3.x uses a FARPROC for dialogs
#if !defined(_WIN32)
#define DLGPROC FARPROC
#endif
//
// FUNCTION: WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
//
// PURPOSE: calls initialization function, processes message loop
//
int APIENTRY WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
MSG msg;
HMENU hMenu;
BOOL bOldState = FALSE;
// Other instances of app running?
if (!hPrevInstance) {
// Initialize shared things
if (!InitApplication(hInstance)) {
return (FALSE); // Exits if unable to initialize
}
}
if (NULL == (hTTYWnd = InitInstance( hInstance, nCmdShow )))
return ( FALSE ) ;
ghInst = hInstance;
hMenu = GetMenu( hTTYWnd ) ;
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 ) ;
EnableMenuItem( hMenu, IDM_CONFIGUREMODEM,
MF_ENABLED | MF_BYCOMMAND ) ;
CreateTTYInfo( hTTYWnd );
if (NULL == (pTTYInfo =
(PTTYINFO) GetWindowLong( hTTYWnd,GWL_PTTYINFO )))
return ( FALSE ) ;
while (GetMessage(&msg, NULL, 0, 0)) {
if (!TranslateAccelerator (msg.hwnd, ghAccel, &msg)) {
TranslateMessage(&msg);// Translates virtual key codes
DispatchMessage(&msg); // Dispatches message to window
}
} /* end while (not a quit message) */
DestroyTTYInfo( hTTYWnd ) ;
// Returns the value from PostQuitMessage
return (msg.wParam);
// This will prevent 'unused formal parameter' warnings
lpCmdLine;
}
//---------------------------------------------------------------------------
// BOOL NEAR InitApplication( HANDLE hInstance )
//
// Description:
// First time initialization stuff. This registers information
// such as window classes.
//
// Parameters:
// HANDLE hInstance
// Handle to this instance of the application.
//
//---------------------------------------------------------------------------
BOOL NEAR InitApplication( HANDLE hInstance )
{
WNDCLASS wndclass ;
// register tty window class
wndclass.style = 0 ;
wndclass.lpfnWndProc = TTYWndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = sizeof( DWORD ) ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = NULL;
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ) ;
wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1) ;
wndclass.lpszMenuName = MAKEINTRESOURCE( IDR_MENU1) ;
wndclass.lpszClassName = gszTTYClass ;
return( RegisterClass( &wndclass ) ) ;
} // end of InitApplication()
//---------------------------------------------------------------------------
// HWND NEAR InitInstance( HANDLE hInstance, int nCmdShow )
//
// Description:
// Initializes instance specific information.
//
// Parameters:
// HANDLE hInstance
// Handle to instance
//
// int nCmdShow
// How do we show the window?
//
//---------------------------------------------------------------------------
HWND NEAR InitInstance( HANDLE hInstance, int nCmdShow )
{
HWND hTTYWnd ;
// create the TTY window
hTTYWnd = CreateWindow( gszTTYClass, gszAppName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL ) ;
if (NULL == hTTYWnd)
return ( NULL ) ;
ShowWindow( hTTYWnd, nCmdShow ) ;
UpdateWindow( hTTYWnd ) ;
return ( hTTYWnd ) ;
} // end of InitInstance()
//---------------------------------------------------------------------------
// LRESULT FAR PASCAL TTYWndProc( HWND hWnd, UINT uMsg,
// WPARAM wParam, LPARAM lParam )
//
// Description:
// This is the TTY Window Proc. This handles ALL messages
// to the tty window.
//
// Parameters:
// As documented for Window procedures.
//
//---------------------------------------------------------------------------
LRESULT FAR PASCAL TTYWndProc( HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam )
{
LONG lrc;
HMENU hMenu;
LONG lResult;
switch (uMsg)
{
case WM_CREATE:
mytapi.bInitialized = FALSE;
break;
case WM_COMMAND:
{
switch ((DWORD) wParam)
{
case IDM_DISCONNECT:
// disconnect any connected calls
lResult = lineDrop(mytapi.hCall,NULL,0);
if (!(lResult>0)) {
ProcessTAPIError(lResult);
MessageBox(hWnd, "ERROR", "Error dropping call", MB_OK);
}
// need to place a wait loop here until linedrop succeeds
// then close the line, but do not completely shut down
//telephonyShutdown();
hMenu = GetMenu(hWnd);
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_ANSWER:
if (!mytapi.bLineopen) {
if (telephonyOpen(hWnd, ghInst)) {
MessageBox(hWnd, "Error", "Error opening line", MB_OK);
break;
}
}
mytapi.bWaitForCall = TRUE;
break;
case IDM_MAKECALL: {
char szTemp[60];
LPLINETRANSLATEOUTPUT lto;
LINECALLPARAMS *pCallParams;
if (!mytapi.bLineopen) {
if (telephonyOpen(hWnd, ghInst)) {
MessageBox(hWnd, "Error", "Error opening line", MB_OK);
break;
}
}
if (!(mytapi.pLineaddressstatus->dwAddressFeatures &
LINEADDRFEATURE_MAKECALL)) {
MessageBox(hWnd, "Error",
"Line/address does not support \
lineMakeCall", MB_OK);
break;
}
if (!DialogBox (GetModuleHandle(NULL),
MAKEINTRESOURCE(IDD_DIAL),
hWnd, (DLGPROC)DialDialogProc))
break;
if (mytapi.szDialNumber[0] != '+') {
szTemp[0] = '+';
lstrcpy(&szTemp[1], mytapi.szDialNumber);
lstrcpy(mytapi.szDialNumber, szTemp);
}
lResult = lineTranslateDialog(mytapi.hTAPI,
mytapi.dwLine, mytapi.dwVersionToUse,
hWnd, mytapi.szDialNumber);
if (!(lResult==0)) {
/* Process error */
ProcessTAPIError(lResult);
MessageBox(hWnd, "ERROR", "Error translating address", MB_OK);
break;
}
lto = (LINETRANSLATEOUTPUT *)
calloc(sizeof(LINETRANSLATEOUTPUT)+5000,1);
lto->dwTotalSize = sizeof(LINETRANSLATEOUTPUT)+5000;
lResult = lineTranslateAddress(mytapi.hTAPI,
mytapi.dwLine, mytapi.dwVersionToUse,
mytapi.szDialNumber, 0,
0,lto);
if (!(lResult==0)) {
/* Process error */
ProcessTAPIError(lResult);
MessageBox(hWnd, "ERROR", "Error translating address", MB_OK);
free (lto);
break;
}
else {
memcpy (mytapi.szDialNumber,
(LPSTR)
((DWORD)lto+lto->dwDialableStringOffset),
lto->dwDialableStringSize);
mytapi.szDialNumber[lto->dwDialableStringSize] = 0;
}
free (lto);
pCallParams = (LINECALLPARAMS *)
calloc(sizeof(LINECALLPARAMS),1);
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);
MessageBox(hWnd, "ERROR", "Error making call", MB_OK);
free (pCallParams);
break;
}
free (pCallParams);
hMenu = GetMenu(hWnd);
EnableMenuItem( hMenu, IDM_DISCONNECT, MF_ENABLED | MF_BYCOMMAND ) ;
break;
}
case IDM_CONFIGUREMODEM:
hMenu = GetMenu(hWnd);
// if not initialized, do it now
if (!mytapi.bInitialized) {
if (telephonyInitialize(hWnd, ghInst)) {
MessageBox(hWnd, "Error", "Error initializing", MB_OK);
break;
}
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 ) ;
}
// get new settings
lResult = telephonySettings (hWnd);
if (!(lResult==0)) {
ProcessTAPIError(lResult);
MessageBox(hWnd, "ERROR", "Error configuring modem", MB_OK);
}
break;
case IDM_EXIT:
PostMessage( hWnd, WM_CLOSE, 0, 0L ) ;
break ;
}
}
break ;
case WM_PAINT: {
PaintTTY( hWnd ) ;
break ;
}
case WM_SIZE:
SizeTTY( hWnd, HIWORD( lParam ), LOWORD( lParam ) ) ;
break ;
case WM_HSCROLL:
ScrollTTYHorz( hWnd, (WORD) wParam, LOWORD( lParam ) ) ;
break ;
case WM_VSCROLL:
ScrollTTYVert( hWnd, (WORD) wParam, LOWORD( lParam ) ) ;
break ;
case WM_CHAR:
/* echo to local window if echo turned on */
if (LOCALECHO (pTTYInfo)) {
WriteTTYBlock(hWnd, (LPBYTE)&wParam, 1 );
}
if (!WriteFile(mytapi.hComm, (LPBYTE)&wParam, 1, &lrc, NULL)) {
/* handle error */
locProcessCommError(GetLastError ());
} /* end if (error reading bytes) */
break ;
case WM_SETFOCUS:
SetTTYFocus( hWnd ) ;
break ;
case WM_KILLFOCUS:
KillTTYFocus( hWnd ) ;
break ;
case WM_DESTROY:
PostQuitMessage( 0 ) ;
break ;
case WM_CLOSE:
if (IDOK != MessageBox( hWnd, "OK to close window?",
"TTY Sample",
MB_ICONQUESTION | MB_OKCANCEL ))
break ;
// shutdown telephony
if (mytapi.bInitialized)
telephonyShutdown();
default:
return( DefWindowProc( hWnd, uMsg, wParam, lParam ) ) ;
}
return 0L ;
} // end of TTYWndProc()
/****************************************************************************
FUNCTION: DialDialogProc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -