Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14490285
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:47:28

下载本文示例代码
p>  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_MACHINE\SOFTWARE\Micr\Windows\CurrentVersion\RUN 行,添加键值名(如: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函数以更好地为自己程序服务。 p>  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_MACHINE\SOFTWARE\Micr\Windows\CurrentVersion\RUN 行,添加键值名(如: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函数以更好地为自己程序服务。 下载本文示例代码


利用API函数开发DELPHI程序利用API函数开发DELPHI程序利用API函数开发DELPHI程序利用API函数开发DELPHI程序利用API函数开发DELPHI程序利用API函数开发DELPHI程序利用API函数开发DELPHI程序利用API函数开发DELPHI程序利用API函数开发DELPHI程序利用API函数开发DELPHI程序利用API函数开发DELPHI程序利用API函数开发DELPHI程序利用API函数开发DELPHI程序利用API函数开发DELPHI程序利用API函数开发DELPHI程序
阅读(118) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~