delphi实现座机来电弹屏的方法

座机来电弹屏在一些行业经常有使用,而delphi作为桌面开发的利器,使用者目前还不少。如何有简单代码实现来电弹屏呢?本代码以中盛座机来电显示盒为例,实践了回调函数的使用。

该来电盒稳定可靠,编程简单。来电显示盒有串口和usb免驱两种,后者应用较多,本代码是后者的一种简单实现。

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    btnInit: TButton;
    btnFree: TButton;
    Memo2: TMemo;
    Label1: TLabel;
    procedure btnInitClick(Sender: TObject);
    procedure btnFreeClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  {
  说明:ZSCIDDLL.dll包含二个函数,一个是初始化函数,一个是释放函数。
 使用前先执行初始化函数ZSCIDInit,程序结束的时候执行ZSCIDFree。
 初始化函数返回值为一longint类型的数值,ZSCIDFree的输入参数需要使用这个数值,所以必须为全局变量,demo中的FRef参数即是。
 通常在create事件和destroy事件中调用,程序中为了描述方便,在init按钮和free按钮中调用
 }



{
ZSCIDInit函数说明:
输入参数:两个回调函数的入口地址,回调函数的写法请参考:OnFremRecieve函数。返回值:句柄
重要说明:第一个回调函数处理的是来电字符串,AT指令返回的字符串,摘机挂机字符串等,和串口控件的接收事件一样。
第二个回调函数处理的是以下几种状态字符串:'检测到带录音和拨号的字符串。','带录音和拨号的来电盒被移除。'}
function ZSCIDInit(  ACidEvent:Pointer;AStateEvent:Pointer):LongInt;stdcall external 'ZSCIDDLL.dll';
///////////////////////////////////////////////////
{输入参数:句柄}
procedure ZSCIDFree(ARef:LongInt );stdcall external 'ZSCIDDLL.dll';
///////////////////////////////////////////////////


var
  Form1: TForm1;
  FRef:LongInt; {很重要}

implementation

{$R *.dfm}


{
回调函数,来电号码在这个函数里面处理。 ZSCIDInit函数的参数需要使用这个回调函数的入口地址。
发送AT指令后返回的字符串也在该函数中处理。
}
procedure onFrmRecieve(const Data: PChar);stdcall;
var
  s:string;
begin
  s := StrPas(data);
  Form1.Memo1.Lines.Add(s);
end;

{回调函数,字符串为状态提示,'检测到来电显示盒。','来电显示盒被移除。' }
procedure onFrmState(const Data: PChar);stdcall;
var
  s:string;
begin
  s := StrPas(data);
  Form1.Memo2.Lines.Add(s);
end;


procedure TForm1.btnInitClick(Sender: TObject);
begin
  FRef := ZSCIDInit(  @onFrmRecieve,@onFrmState);
end;

procedure TForm1.btnFreeClick(Sender: TObject);
begin
  if FRef > 0 then
  begin
    ZSCIDFree(FRef);
    FRef := 0;
  end;
end;

end.

 

posted @ 2017-11-19 19:12  codesoeasy  阅读(240)  评论(0)    收藏  举报