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

📄 monform.pas

📁 TAPI 编程事例
💻 PAS
字号:
unit MonForm;

interface

uses
	WinTypes, WinProcs, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Tapi,
	StdCtrls;

type
	TfrmTAPIMon = class(TForm)
    Memo1: TMemo;
		procedure FormCreate(Sender: TObject);
		procedure FormDestroy(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
	private
		{ Private declarations }
		lineApp: THLineApp;// TAPI应用句柄
		line: THLine;      // 呼叫句柄
	public
		{ Public declarations }
	end;

var
	frmTAPIMon: TfrmTAPIMon;

implementation

{$R *.DFM}

uses Main;

var
	buf:array[0..1023] of char;
	callinfo: TLineCallInfo absolute buf;
	{
    这两个变量指向同一个地址
    而lineGetCallInfo函数需要一个TLineCallInfo类型的指针
	}

{
  TAPI回调函数,处理TAPI各类的消息。
  主要用于实现监视线路状态
}
procedure lineCallback(hDevice, dwMsg, dwCallbackInstance,
		dwParam1, dwParam2, dwParam3: LongInt);		stdcall;
	var
		s: string;
		hCall: THCall;
    
	begin
  {线路状态发生了改变}
	if dwMsg = LINE_CALLSTATE then
		begin
		hCall := THCall(hDevice);//获取当前呼叫句柄
		case dwParam1 of

      { 呼叫无效 }
			LINECALLSTATE_IDLE:
				if hcall <> 0 then
					begin
					lineDeallocateCall(hCall);	// 释放呼叫句柄 
					frmTAPIMon.Memo1.Lines.Add( 'Idle - monitored call deallocated');
					end;

      { 呼叫建立成功 }
			LINECALLSTATE_CONNECTED:
				if hCall <> 0 then
					begin
					frmTAPIMon.Memo1.Lines.Add('Connected');
					callinfo.dwTotalSize := 4096;
					if lineGetCallInfo(hCall, callinfo) = 0 then
						begin
						if callinfo.dwAppNameSize > 0 then
							begin
              //返回当前使用该线路的程序名称
							s := ' * AppName: ' + (buf + callinfo.dwAppNameOffset); 
							frmTAPIMon.Memo1.Lines.Add(s);
							end;
						end;
					end;

      { 呼叫处理过程中  }
			LINECALLSTATE_PROCEEDING:
				frmTAPIMon.Memo1.Lines.Add( 'Proceeding');
      { 呼叫拨号过程中  }         
			LINECALLSTATE_DIALING:
				frmTAPIMon.Memo1.Lines.Add( 'Dialing');
      { 呼叫远端挂起  }           
			LINECALLSTATE_DISCONNECTED:
				frmTAPIMon.Memo1.Lines.Add('Disconnected');
			end;
		end;
	end;

procedure TfrmTAPIMon.FormCreate(Sender: TObject);
	var
		nDevs, tapiVersion: Longint;
		extid: TLineExtensionID;
    
	begin
	{ 初始化 TAPI }
	if lineInitialize(lineApp, HInstance,
			lineCallback, nil, nDevs) < 0 then		{ < 0 是错误的 }
		lineApp := 0

  { 如果没有设备则释放线路设备 }
	else if nDevs = 0 then
		begin
		lineShutDown(lineApp);
		lineApp := 0;
		end
    
  {检查TAPI的版本号}
	else if lineNegotiateAPIVersion(lineApp, 0, $00010000, $10000000,
			tapiVersion, extid) < 0 then
		begin
		lineShutDown(lineApp);
		lineApp := 0;
		end

	{ 打开线路,得到由Windows返回的线路设备句柄,通常是Modem }
  { 指定参数dwPrivileges为LINECALLPRIVILEGE_MONITOR,用于实现监控 }  
	else if lineOpen(lineApp, 0, line, tapiVersion, 0, 0,
			LINECALLPRIVILEGE_MONITOR, LINEMEDIAMODE_DATAMODEM, nil) < 0 then
		begin
		lineShutDown(lineApp);
		lineApp := 0;
		line := 0;
		end;

  {显示信息}  
	if lineApp <> 0 then
		Memo1.Lines.Add( 'Monitoring calls...')
	else
		Memo1.Lines.Add( 'Error!');
	end;

procedure TfrmTAPIMon.FormDestroy(Sender: TObject);
	begin
	{ 终止TAPI,释放当前窗体,推出程序后才执行 }
	if line <> 0 then
		lineClose(line);
	if lineApp <> 0 then
		lineShutDown(lineApp);
	frmMain.Monitor := False;
	end;

  { 关闭窗体}
procedure TfrmTAPIMon.FormClose(Sender: TObject; var Action: TCloseAction);
	begin
	Action := caFree;
	end;

end.

⌨️ 快捷键说明

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