利用API函数开发DELPHI程序


  Windows的API函数是 利用程序开发的有力辅助工具,对它们的 适当 使用,可大大 加强和改良 利用程序与系统打交道的 威力,使自己的程序 真正 存在底层操作 性能 。作为RAD工具的 根底代表,BORLANDDELPHI 固然 本身也已提供了大 量强有力的函数和过程,但在某些场合、要求下, 使用API函数将使你的程序进一步得到改 善,并可拓宽 规模,简化程序代码 。

  在DELPHI中 引用API函数,和 使用DELPHI 本身的函 数、过程 几乎没有区别 。在DELPHI目录下有一个WINDOWS.PAS文件, 但凡在其中申明过的API 函数,都可在编程时直接 引用而 毋庸另加 注明 。只不过要 留神, 标准API函数都是以C或C++为 标准进行数据 构造定义的,而DELPHI 使用的是OBJECTPASCAL语言, 因此在 引用时应特殊注 意参数和函数 本身的数据类型 。如一个API函数若为布尔值,则在DELPHI中就应以TRUE、FALSE 而不能用0、非0来对返回值进行推断 。

  下面以三个小例子来 注明API函数在DELPHI中的 使用 。

  一、当地化 信息框

  想让自己的 信息框显示“OK”、“Cancel”还是“确定”、“ 取缔”?假如想使程序彻底当地化,那么还是抛弃MessageDlg和ShowMessage吧——都怪DELPHI 没有 。用MessageBox这个API函数照样容易 。

   使用语法为:

MessageBox(HWND:hWND,lpMessage:

PChar,lpCaption:PChar,uType:Cardinal);

  各参数中,第一个为 信息框所属的窗口句柄,第二 个为要显示的 信息,第三个为 信息框的 题目,第四个为 信息框的类型,函数返回值为整型数 。

  为使 信息框有所归属,第一个参数设为目前窗口, 猎取其句柄的 步骤是 使用另一个API函数:GetActiveWindows(),且不需任何参数 。

  例1)Messagebox示例:

  1.重要构件及属性的设置:

form1:caption:messagebox示例 

bordericons:biMaximize和biHelp设为false

panel1:caption:文字 部分Alignment:taLeftJustify

panel2:caption:图象 部分Alignment:taLeftJustify

button1'button12:caption分别为:确定、确定 取缔、

确定协助 取缔、是不是、重试 取缔、终止重试 取缔、

信息、 发问、系统图标、 忠告、 停留、组合 模式

bitbtn1:kind:bkClose

  如图一所示:

  2.事件 注明:(详见源程序,下仅举两例)

{文字 部分以button2click()为例}

procedureTForm1.Button2Click(Sender:TObject);

begin

casemessagebox(getactivewindow(),

显示确定、 取缔框,例子,

   okcancel)

ofidok:messagebox(getactivewindow(),

您按下的是“确定”按钮,

后果,mb_ok);

idcancel:messagebox(getactivewindow(),

您按下的是“ 取缔”按钮,

后果,mb_ok);

end;

end;

{图象 部分以button8click()为例}

procedureTForm1.Button8Click(Sender:TObject);

begin

messagebox(getactivewindow(),显示 忠告图标,例子,

mb_iconwarning)

end;

  二、改良Windows9x的系统登录的安全性:

  Win9x的“消费者登录”窗口 堪称来者不拒,密码不 对比样 可以“登堂入室”,系统为消费者保留的个人设置等信息也就毫无保密性可言,通过查 看Profiles目录,可轻松地将其复制或删除 。 固然Win95、Win98的 利用对象是个人消费者,但 在某些场合下,还是让登录窗口起点作用的好 。

  要使系统登录 存在安全性,对非法 使用者真正能 拒之门外, 不妨用两个API函数来实现此 目标 。

  例二)系统登录 审查

  1.重要构件及属性设置:

form1:caption:CheckUser

height、width:设为最小值

  2.事件 注明:

//定义变量

private

size:cardinal;

name:pchar;

entry:boolean;{Privatedeclarations}

procedureTCheckUser.FormShow(Sender:TObject);

begin

size:=64;

name:=StrAlloc(64);

{ 审查消费者名,推断是按了“ 取缔”按钮还是键入了新消费者名}

ifGetUsername(name,size)

thenifname=’wj’//‘wj’为小编机器的登录消费者名

{在此,若同意的合法 使用者不止一个,还可利用关系运算指定

一个以上的消费者进入 。

如:if(name=’computer1’)or(name=’computer2’)

}

thenentry:=true;

close;

end;

procedureTCheckUser.FormClose

(Sender:TObject;varAction:TCloseAction);

begin

ifnotentry

thenExitWindowsEx(EWX_REBOOT,32);

//若消费者名不对,则再一次启动Windows

end;

procedureTCheckUser.FormCreate(Sender:TObject);

begin

entry:=false;//设定初始值

end;

  编译 结束后,生成EXE文件, 而后 打开注册表—— 使用Regedit,找到HKEY_LOCAL_MACHINESOFTWAREMicrWindowsCurrentVersionRUN 行,增加键值名(如:CheckUser)及键值(EXE文件所在的 完全路径) 。如图所示:

  好了,再一次启动一次,没有正确的密码还能进入吗 ?

  三.没有“媒体播放器”的声音播放

  目前做了一个小程序,想在“对于”窗口外加一段 声音 注明,但小小的“对于”FORM放上一个长长的、Visible属性需为False的MediaPlayer构 件 着实别扭 。东查西找之下,还是靠API函数SNDPLAYSOUND()解决了问题——从而 开脱了MediaPlayer 的“ 禁锢” 。例三) 使用API函数操纵声音文件的播放:( 部分代码)

procedureTaboutBox.FormShow(Sender:TObject);

begin

//播放目前目录下的welcome.wav文件

sndplaysound(‘welcome.wav’,snd_async)

end;

procedureTAboutBox.FormClick(Sender:TObject);

begin

// 停留播放

sndplaysound(‘’,snd_async);

end;

  别忘了,在USES子句中加入mmsystem单元 。假如只 需求播放声音,那么一条API函数就能实现 性能的还用得着MediaPlayer来大动干戈吗?

  总之, 使用DELPHI的“聪慧的程序员”们应该 充足 施展DELPHI调用API函数容易快捷的优势,好好利用API函数以更好地为自己程序服务 。