说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在Delphi中调用API函数

HTML文档下载 WORD文档下载 PDF文档下载
在Delphi中调用API函数

一、概述

Delphi作为一种面向对象的可视化开发工具,以其开发程序的高速度和编译代码的高效率越来越受到广大编程人员的喜爱。Delphi本身提供了包括界面设计、数据库操作、报表打印和Internet等在内的数十个组件,开发者使用它们可以非常容易、快速地制作出所要的应用系统,同时所需要的编程量却非常地小。除此之外,delphi同时秉承了borland公司产品一贯的编译效率高,速度快特色。

Delphi2.0版本以上的产品完全支持32位应用程序的开发,完全支持windows95和windowsNT提供的所有API函数。应用程序接口(API)是windows提供的任何Windows应

用可以访问的函数的集合。尽管Delphi已经提供了非常强大的开发组件(VCL),但灵活使用API函数一定可以使你的程序增色不少。

二、状态键的检查

当今不少流行软件的编辑窗口(包括Delphi的代码编辑窗口)的底部都有一个状态条用来显示一些状态信息,比如当前光标的位置、页码消息和状态键的状态。什么是状态键呢?我们知道键盘上大多数按键只有在按下时才能为系统所识别,而状态键的共同特点就是他们好似一个开关,每按一次就切换到相反状态直至下一次按键为止。通常键盘的状态键包括[NumLock],[ScrollLock],[CapsLock]和[Insert]这四个键,在编辑窗口中显示状态键的状态可以使你的界面更友好,更有利于方便用户。

使用delphi强大的开发功能和API提供的GetKeyboardState()函数,你可以轻松地在你的程序中实现状态键检测这一功能。

也许有些读者要问:我可以使用delphi提供的OnKeyPress函数捕捉按键动作来完成这一功能,又有什么必要调用API函数呢?这就涉及到状态键的另一个特点:即它的状态与程序运行无关。比如说你在word中按下insert键后再切换到delphi中输入代码,这个键的状态仍然保持不的状态仍然保持不变。而如果只使用OnKeyPress函数,那么当你的程序在后台运行时就无法捕捉到在前台程序中发生的按键动作,所以当切换到你程序时也就无法正确反映状态键的状态。因此需要使用API的GetKeyboardState()函数来检查键盘状态。当调用GetKeyboardState()函数时,你需要在程序中开辟一个256字节的缓冲区用来存储键盘上各个键的状态(最简单的方法你可以声明一个TKeyboardState变量)你可以根据缓冲区中相应位置的值来判断键盘状态,下表显示了系统常量和其相应的按键。(你如果想查看所有

的键值列表可以在help菜单选择windowsAPI中输入关键字virtualkeycodes,然后按下Show键)

常量按键名称

VK—INSERT[Insert]键

VK—NUMLOCK[NumLock]键

VK—CAPITAL[CapsLock]键

VK—SCROLL[ScrollLock]键

键盘缓冲区每一位都有特定的格式,对于状态键来说,最低位是1时表示状态键处于ON状态,你可以使用delphi提供的Odd()函数来确定这一位的状态。为了使程序显示正确的状态键的状态,你需要定期调用GetKeyboardState()函数来不断的查询键盘状态,实现这一功能最简单的方法是使用Timer组件。

下面举一个小例子来说明如何具体实现这一调用功能,在这个例子中我们将检查[NumLock]键的状态并把它显示在屏幕底部的状态栏。

从Component模板Win95页中选择StatusBar组件,按如下所示设置它的属性

AlignalBottom

Height20

从system页中的选择Timer组件并把它放入窗体,双击Timer组件弹出OnTimer事件的代码编辑窗口,按如下所示添加代码:

procedureTForm1.Timer1Timer(Sender:TObject

);

varKeyStates:TKeyboardState;

begin

GetKeyboardState(KeyStates);

begin

ifOdd(KeyStates[VK—NUMLOCK])then

StatusBar1.Panels.Items[0].Text:Κ′NUM

else

StatusBar1.Panels.Items[0].Text:Κ″

end;

我们可以检验一下程序的运行结果。运行程序,可以看到状态条中正确显示了当前的状态,切换到另一个程序改变[numlock]键的状态再切换回运行程序,可以看到状态条的状态已经改变。一般说来,在程序中加入状态条显示相应信息对于用户来说是十分方便的。

三、改变提示框(hint)的特性

许多程序在特定的控件上都有提示框,当鼠标在这些控件上停一定时间以后就可以显示提示框。在Delphi中实现提示框是非常容易的,只要设定相应的属性即可,这里就不详细讨论了。但通常的提示框都是以黄色矩形框的形式显示在对应控件的左下角,以下这段代码说明了如何使用API改变delphi中提示属性的一些特性。有一点需要声明的是代码中使用到的GetIconInfo函数只适用win32(也就是说你只能在delphi2.0以上的版本中使用以下代码)

把以下代码加入到主窗体的Oncreate事件中,加入代码后的主窗体的formcreate过程的代码如下所示:

主窗体的formcreate过程的代码如下所示:

procedureTMainForm.FormCreate(Sender:TObjec

t);

begin

...

Application.OnShowHint.ΚGetHintInfo;

end;

然后把以下过程声明加入到主窗体的public段

procedureGetHintInfo(VarHintStr:sting;VarCanShow:boolean;varHintInfo:THintInfo);

最后,在主窗体的implementation部分加入过程的实现代码,加入完代码的过程如下所示:

procedureTMainForm.GetHintInfo(varHintStr:string;varCanShow:boolean;varHintInfo:THintInfo);

var

II:TlconInfo;

Bmp:Windows.TBitmap;

begin

withHintInfodobegin//应该保证有控件使用定义了Hint属性

ifHintControlΚNILthenexit;

HintPos:ΚHintControl.ClientToScreen(Cursor

Pos);

//把光标坐标系由相对于提示改为相对于屏幕

GetIconInto(Screen.Cursors[HintControl.Cursor],II);

//获得有关提示控制使用的有关光标的信息

GetObject(II.hbmMask,SizeOf(Windows.TBitmap);

//获得有关光标的位图(bitmap)信息

ifII.hbmColorΚ0then

inc(HintPos.Y,Bmp.bmHeightdiv2)

//如果光标不包括彩色位图,增加Y方向

else

inc(HintPos.Y,Bmp.bmHeight);

dec(HintPos.Y,II.yHotSpot);

//减掉y方向的热点位置

DeleteObject(II.hbmMask);

DeleteObject(II.hbmColor);

//清除位置句柄

end;

end;

通过改变HintPos.X和Y的值可以在任意位置显示提示框。Word7.0中滚动纵向滚动条时页码序号总是显示鼠标在左方,用以上代码实现这一功能可以说是易如反掌。

苹果继续改改改!Swift语言何时能稳定? 封闭还是开放?Android Wear离iOS究竟有多远 TIOBE 2015年3月编程语言排行榜:CoffeeScript首次进入TOP 100 2015网页摄影图的六大流行趋势 原生体验挡不住!JavaScript开源跨平台框架NativeScript 自行车,恰到好处的“智能” 联通WO+开放平台:保护消费者权益就是保护移动互联网生态 2015年Google Code Jam编程挑战赛开始报名 Impression Pi:VR头盔的进阶形态 King.com和Halfbrick Studios成功背后的21款工具 五大实用技巧 帮设计师实现高效会议沟通 机遇与挑战并存 Testin进军众测 新增多SIM卡API,Android 5.1 SDK正式发布! 谷歌代码托管平台Google Code将正式关闭 提升Sketch使用效率的6个实用技巧 界面设计原则之一篇:权衡优先级 突出焦点 划分好内容层级 开源的ResearchKit:苹果将如何颠覆未来医疗? CocoaPods 0.36正式发布,实现Swift和iOS 8动态框架支持 C++入门学习书籍推荐 GitHub是如何征服Google、微软和其它公司的 约见越狱大神!2015 MSS移动安全峰会议程披露 Spark 1.3更新概述:176个贡献者,1000+ patches 从游戏设计到星际探险,微软HoloLens全息技术将改变什么? 触摸屏技术未来?详解Apple新手段Force Touch 专访云适配CEO陈本峰:紧跟HTML5热潮,Web组件化知多少? QQ音乐5.0全新设计过程要点解析 GDC 2015感悟:从0到1,VR投入手游开发路漫漫 TestBird发布手游真人众测平台——附中国手游兼容性测试白皮书 与用户的再一次连接,微软的免费升级计划背后 颠覆App!LayaBox用Flash开发重度HTML5游戏 WinHEC:微软小娜与小冰正式登陆Windows 10平台 华泰贝通,北京创智你去那家? /***VC 6.0 的两个操作*/ 有关编译错误,百思不得其解!!(菜鸟那分) 怎么实现程序的换肤功能呢?? 怎样实现左连接(left outer join),右连接 这个网站制作费能值多少?? 怎样处理异质链表? 报表打开的时候缺省为最大化状态,怎么样为设计时候状态? 除了梅尔森式外,还有哪个比较好用的质数生成式?(要100位左右的) 如何在英文版的WINDOWS2k上输入中文? 为了提高大家专家分的质量,希望大家不要再散分了! 我在sun的网站上下了jdk1.4,请问怎么把JBuilder6的jdk升级到jdk1.4? 大家给推荐windows程序,sdk编程的入门好书(不是MFC的)言者有分 我在http://soft.jx163.com/上下载了JBuilder7但不知道怎样得到注册码 有没有其它免费空间(要支持ASP的) 为什么每次打开水晶报表都要求输入oricle数据库的密码和用户名,这些可以在程序里面完成吗?可以再crystalreportviewer空间里面实现翻页 请解释一下ASSERT()函数的作用 informix问题,紧急求救 求救!高手请进来 求助:build winsock 程序时出现 link 错误。 怎样能够将source safe link 像VC哪样集成到自己的应用程序? 关于用ASP+JMAIL开发一个像网易那种类似功能邮件系统的可行性!!!!大家来讨论一下!!! SQL Server7.0的ODBC驱动哪里有(不想安装客户端) 怎样将form中的值加入到数据库中 这个程序是在哪里和在什么时候执行的???? 急啊,我第一次用SQL SERVER,需要把ID号的属性定义为可自动编号,可是找不到相应的字符,可不可一帮帮我? 怎样使DLG的CLOSE(X)按钮变灰? ???? 关于managementserver的问题 b/s中的中文问题 关于udp发送的一些疑惑,请指点,up,gz也给分?(udp) pb的连编问题 对不起大家,内疚ing... 我的专家分怎么忽高忽低?谁给我解释解释! 各位老大,这种报表如何做啊?很急的啊!!!!!!!! 看看这样的东东有没有? win2000 server 启动巨慢,没有病毒,怎么办,症状如下: 用户权限的问题 怎样才是高效的多重循环? 紧急查找pcl-735,db-37的开发接口资料,100分!! 在VC中为什么使用MFC,好处有哪些? 放大問題!20分 高分求教,在线等待!!具体问题请进..... 为什么java出这样的问题 初学者多层分布式的问题 请问谁有从数据库填充DropDownList控件的例子, 这个DropDownList是要在DataList的EditItemTemplate中的,谢谢! 请问谁有从数据库填充DropDownList控件的例子, 这个DropDownList是要在DataList的EditItemTemplate中的,谢谢! BC++安装只用15张DISK,后面3张为什么不用? 一个小问题 weblogic+ejb高手请出来赐教 000000000000020.0000000000000000分提问:以前的加密文件现在如何查看? 我们现实生活中处处都用到数学吗?能举例说明吗?比如比较男人与女人的异同用到了那些数学知识? 请选择运用“对称”、“平移”、“旋转”、“比例”等数学知识在方格图中设计一个图案,并写一写你设计的想法和用到的方法 如图所示,在△ABC中,AB=AC,点MN分别在BC所在的直线上,且AM=AN,BM与CN相等吗?图是一个等腰三角形 顶点为A,点MBCN依次跟A相连 我儿子 手指纹十个斗 脚指十个簸箕我儿子手指纹十个斗, 脚指十个簸箕..挺有意思的..有这方面详知的.透解一下///////他爸爸十指是簸箕..不知道会不会与这个有关联//谢谢啦,知道这种是信其 高一化学题、关于氮的、具体见补充、急求!已知A是单质,A、B、C、D、E 5种物质均含同一种元素,X是地壳中含量最多的元素形成的单质,它们的相互转化关系如下图所示.试回答下列问题.  (1 点解电容是分正负极的,在电路里面怎么接呢?正负极接法有什么特殊规定吗? 手指纹是10个簸箕好不好我的是10个簸箕的 这样的指纹有什么说法吗,跟两个手指分别有1个螺的人配吗 氧气本身具不具有可燃性? 我要做的这个多普勒效应实验的其中一个部分是这个“研究匀速直线运动”,但貌似这一部分只用到了光电门,不是很明白它与多普勒效应的关系, 平抛运动 性质理论意思 类平抛运动与平抛运动的区别具体 多普勒效应实验论文 设计一种装置,能用排水法收集二氧化碳.(提供:集气瓶、导管、胶塞、水、植物油) 类平抛运动举例 在多普勒效应实验中,频率的调节是以什么为依据的,为什么? 模电和信号与系统哪门课先学 PS:我读的是生物医学工程他们的关系? 求'平抛运动和类平抛运动什么区别? 气态烃对氢气相对密度是14,也就是说它的相对分子质量是氢气的14倍,为什么这样理解?相对密度与相对分子质量有什么关系吗? 一堂生物课的启示 (选段)世界上的任何事情都不是像“树叶是绿的”那样简单,因而自己的头脑也要复杂一点,你要认识它,就要在实际中去调查了解,不能人云亦云1.说说你对这段话的理解— 高二类平抛运动一束初速不计的电子流在经过U=5000V的加速电压加速后,再距两极板等距处垂直进入平行板间的匀强电场,若板间距离D=1.0CM 板长L=5.0CM 那么,要使电子能从平行板间飞出,两个极板 如图,在三角形ABC中,AE是中线,AD是角平分线,AF是高.(1)BE=( )=二分之一(如图,在三角形ABC中,AE是中线,AD是角平分线,AF是高.(1)BE=( )=二分之一( )(2)角BAD=( )=二分之一( )(3)角AFB=( )=90°(4)S(三角 一堂生物课的启示阅读答案 生物具有什么特征生物是有生命的物体,它具有( ),摄取( ),( ),( ),( ),( )和变异等特征. 等边三角形ABC中,D,E分别是BC,CA上的点,CD=AE AD,BE交于点F,BG垂直于DF,求证FG等于二分之一BF 用线电缆和功率计算 1、 生物的种不但不会由于个体的死亡而导致该物种的绝灭.而且能保持此种生物性状的稳定,这是因为所有的生物都具有( )的特征.A.新陈代谢和遗传 B.生殖和遗传C.新陈代谢和应激性 D. 已知,如图,△ABC中,D是BC的中点,F是CA延长线上一点,连接FD交AB于E,若AE=AF,求证:BE=CF求大神们自己画图 小学生生活要乐观的事例最好是亲身经历的,普通一点的别太离谱.一定要关于“生活要乐观的”不要讲大道理或名人的事例哦!急用!要写作文的,3个钟头内得完工! 生物必须具备哪些特征 【举生活中的事例】1物体之间发生相对运动时的摩擦 2物体发生滚动时的摩擦那个 分别都要举两个事例 从容面乐观对生活的事例 求高一必修1的专题四 硫 氮和可持续发展重点和提纲~ 欧尚有卖煤油打火机的煤油吗? 洗气瓶的用途(2种)例如:干燥气体.(瓶内放H2SO4,气体从长进可干燥H2请再举两例:其一是除气体杂质 怎么样用简单的工具绘制标准的五角星?比如直尺、绳子(不能用圆规),反正是一般的木匠师傅有的工具.你们的回答怎么说呢,我要是可以画圆,或者说可以画正五边行就不用去画五角星了 多普勒效应的应用市场上有什么产品是用到多普勒效应 洗气瓶有什么作用? 怎样画标准五角星 A、B是两根竖直立在地上的木桩,轻绳系在两木桩上不等高的P、Q两点,C为光滑的质量不计的滑轮,下面悬挂着重物G.现保持结点P的位置不变,当Q点的位置变化时,轻绳的张力大小变化情况是(A 关于平抛运动做平抛运动的物体在相同时间内,速度的增值量与增值的方向如何? 某有机化合物对氢气的相对密度为30 多普勒效应在工程中有哪些应用?我在物理活动中的一个课题,希望每点能详细一些,不要解释什么叫多普勒效应,我要的是它在工程中的应用, 什么是平抛运动 已知:如图△ABC中,BM,CN是∠ABC,∠ACB的平分线,且AM⊥BM于M,AN⊥CN于N,说明:MN∥BC 关于多普勒效应人距公路约50米,一辆汽车以25m/s的速度从公路上匀速驶过,人听到的汽车的频率如何变化?若某一单一频率的声源在观察者上方匀速运动,听到的声音的频率如何变化? 关于平抛运动啦将两个质量不同的物体同时从同一地点以相同的速度水平抛出,不计空气阻力,则以下说法中正确的是( ) (单选) A.质量大的物体先着地B.质量小的物体飞出的水平距离大C.两 电解电容电路图里的正负极图示是什么样的? 四川省南充市cng气瓶贴电子标签在哪里办理?流程和手续是怎么样的?我是买的新车原装出厂的双燃料汽车,要想去加气怎么办理加气相关手续? 三相四线的功率怎么算 如图⊿ABC中BM.CN平分∠ABC,∠ACB的外角,AM⊥BM于N,AN⊥CN于M,求证MN=½(AB+AC+BC) 非主流的经典语句要长的,还要深奥的.关于爱情方面的,如忧伤,开心等等... 三相电力计量箱如何计算电量?我是新参加工作的,我片上有一个三相电力计量箱,型号为:JLSJWH-10他的电流比为:25.50/1 电压比为:10000/100 在计算它的电量的时候应该怎样计算呢.倍率是 2550倍 如何分辨电路图中27管脚电容的正负极 我是乐山一气体充装站的,我们公司要安装气瓶电子标签,我想问一下在周边地区有哪些做这个的公司,最好附上联系电话,小女子万分感谢! 将碳酸氢铵在试管中加热,使放出的气体依次通过盛有足量灼热的碳粉、灼热的氧化铜粉末、浓硫酸的容器,最后得到的气体是()A 一氧化碳B 二氧化碳C 氨气D 水写明原因, 如图,△ABC中,∠ACB=90°,AC=BC,直线MN过C点,AN⊥MN于N,BM⊥MN于M,那么MN与AN有什么关系,为什么?过程 车改气气瓶电子标签被人偷了,怎么办 将盛有氮气和二氧化氮(假设无N2O4)混合气体的试管倒立于水中,经过足够长的时间后,试管内气体的体积缩小为原来的一半,则原混合气体中氮气与二氧化氮的体积比为?【要给解释.】 请标出下列电路图中两个电容的正负极.C1 和 C2的电容正负极 说出哪段正负极即可 等边三角形ABC,点D,E分别在BC,AC上,且BD=CE,AD与BE相交于点F.证明:AE的平方=BE·EF
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘