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

在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中滚动纵向滚动条时页码序号总是显示鼠标在左方,用以上代码实现这一功能可以说是易如反掌。

揭秘Instagram Hyperlapse背后的技术 【CTO俱乐部在线教育研讨会】用互联网技术深入创新教育产品 降低门槛!Hybrid应用开发框架LigerMobile 下一代IT革命:微服务器和雾计算 使用Mongo Connector和Elasticsearch实现模糊匹配 时隔8个月,物联网联盟AllSeen如今怎样? 《近匠》简网:开发零门槛 快速建原生App MDCC免费展位申请超预期 大会内容初曝光 在服务器与交换机定制之后,谷歌着手量子计算机CPU设计 电信天翼开放平台鲍占斌:优质能力 分成比例高 艾格拉斯副总裁王晓波:手游定价如何设计 Xcode 6 Beta 7发布:语法定、内库改,Swift何时完善? 干货来袭:由22个联邦机构分享的6482个数据集 Phablet出货量今年将超移动PC,明年再超平板 如何提高Web服务端并发效率的异步编程技术? 改改改!让应用通过审核出人头地的10个方法 正益无线CEO王国春:AppCan如何获得50万开发者青睐 在收购Xtreme Labs之后,Pivotal推出PaaS移动服务 .NET开发者必备的11款免费工具 .NET开发不可错过的25款高效工具 Docker最佳实践!尽在2014 Container技术大会 pflua:用Lua编写的高性能网络包过滤工具箱 掌上明珠张磊:如何设计手游付费体系 云游科技何千军:游戏开发和后端逻辑经验 《近匠》Highway1:孵化,不只是简单的帮助 嘉宾来了 MDCC 2014首批演讲嘉宾名单公布 前雅虎CTO:Hadoop扩展过程中的7个危险信号 【云先锋】星环TDH:性能大幅领先于开源Hadoop2的技术架构赏析 一周消息树:我想创业,但不懂技术怎么办? GitHub迁移数据库,借助MySQL大行其道! 实例亲授:教你如何创建AR应用 兄弟们。我在JAVA区竟然得不到答案。只能期望在这里找到帮助了(共200分的问题) 在ACCESS中设置数据表,如何实现数据库中多表间的关联访问,用VC的DAO实现 ORA-12560: TNS:协议适配器错误 vb+asp.net中的datagrid分页遇到问题?附代码 改了IIS账户的密码,ASP不能运行,但原先的密码不记得了!现在要修改什么文件才可以? 为什么反向工程失败? 关于ER图的做法 窗口最大化、最小化问题 本站提供能成为QQ会员的QQ代理,快来~~~ 请帮个忙好吗? 硬盘保护的问题 轻轻地温柔地任人宰割 小程序一个,很简单的,但是这样的问题经常遇到的 关于交换区的问题 d7的序列号码 刚做好的编程技术文章系统,欢迎来翻阅技术文章. ★★★★★ 那位高手有这样的好东东。。。 ★★★★★ 最近流行什么歌? PHP新手: 给一篇在Windows2000环境下PHP的安装,及apache的配置的文章,来者有分 怎么给MM送花 在哪儿下载<WINDOWS 程序设计>? HELP ME!关于TCP/IP传输位图的问题. 刚做好的编程技术文章系统,欢迎来翻阅技术文章. 刚做好的编程技术文章系统,欢迎来翻阅技术文章. 请问怎么在对一个设备发送数据的时候又接受这个设备返回的返回码呢? C++ builder的密码! 如何使用微软自带的扑克牌动态库(crads.dll)? 哪里可以得到teechart pro5? 刚做好的编程技术文章系统,欢迎来翻阅技术文章. 大哥好,我向大家要个数据库,高分求救 这是条什么内存??? 怎样改变上传附件“浏览”按钮的颜色? 请问怎样显示动态的时间? 如何理解? JBuilder 7中如何增加一个Server 三层结构(delphi)中应用服务器如何调用其他模块的方法? JBuilder 7中如何增加一个新的Server 想买一款80G的硬盘,各位推荐一下哪个牌子的质量比较好! 哪儿有JDK1.41下,要速度快的。 我的249个字段,这对操作有影响吗? 请大家给我推荐几本delphi的书。。 想买一款80G的硬盘,各位推荐一下哪个牌子的质量比较好! 有谁用vc做过word的addin? 这是条什么内存??? 请大家帮忙 急急急,乱码问题!!!!! 求助:DIB位图显示的问题 我这里有REDHAT8的5个ISO文件,我要准备安装,应该怎么操作这几个ISO文件? 怎么消除窗体上的标题栏,急!!菜鸟求救~!! asp里面可否传递数组的参数? 连接池的问题 do you want to do any或者some shopping哪个对? jim in the library,i saw him there just now.A maybe B may be C might is 合肥市公安局蜀山分局户籍处电话? 英语翻译请说明原因, the only explananation i can find is the love that i found .ever since you've been around 歌名是? 合肥市公安局蜀山分局稻香村派出所户籍科电话 the first time that I met him, I fell in love with him. 要比较冷酷、比较高傲的那种英文名、女生用的、 李白《蜀山难》翻译 the teacher noticed him ____(play)basketball on the playground just now Only now discovered that,still in love with I have never thought that there will be a such you to Walked into my life.我从来没有想过会有一个这样的你走进我的人生.(过去式)写对了吗? we found him play basketball over there just now改为被动语态They saw the boys playing football when they passed there改为被动语态 鲁迅先生可以用哪个四字词语来形容急 have you ever thought of what makes a trustworthy person? 天气非常好所以他们去公园散步了.翻译 英语未来的我 加中文翻译 Have you thought about ( )your life ( ) when you grow up,Susan?a.how ,is b.what,is c.how ,will like d.what,will be like I saw him ____football just now.是填play还是playing Unknowingly, I fell in love with you是什么意思? Americans eat _____ vegetables per person today as they did in 1990.A.more than twice B.as twice as manyC.twice as many as D.more than twece as many 鸟的天堂里有什么鸟最好全举出来, 孙中山反映的辛亥革命的作用有哪些 12.Americans eat __ vegetables per person today as they did in 1910.(2002上海春)A.more than twice B.as twice as many C.twice as many as D.more than twice as many希望有解题步骤 鸟的天堂 描写鸟的词有. fell in love with you中文!全中文!我已经知道歌词了!我要的是中文!答好了有赏金!跪求中文意思 快滴!歌词 我说的是歌词的中文意思! Do you want an apple?同义句—— —— —— an apple?快 鸟的天堂第十二自然段鸟儿的特点(3个空) 人们常用杜甫的那一句诗来形容老师对学生默默无闻的培育和潜移默化的熏陶? 急!快! Which the apple do you want to?同义句那个...考试的一个题目...句子记不清楚了...见谅哈...大概意思就是这样... 蜀山在哪里? Americans are eating ___vegetables per person today as they did in 1910.A more than twiceB as twice as many C twice as many as D more than twice as many 为什么不能选C 英语翻译SELLER ACCEPTS TO SHIP PRODUCT BACK AT ITS OWN EXPENSE AND FULLY COMPENSATE ALL OF EXPENSE FOUND TO CONTAIN MELAMINE AFTER UNLOADING OR REJECTED BY LOCAL CUSTOMS OR OTHER REGURATORY AUTHORITIES AT DESTINATION.SELLER CONFIRMS TO COMPENSATE "It's the thought that counts."这个句子是什么意思啊? Americans eat -----vegetables per person today as they did in 1990 A more then twice as many B moreAmericans eat -----vegetables per person today as they did in 1990A more then twice as many B more than twice C twice as many as D As twice as much 由 if you have a chance to do something for it 《蜀山主庙》的翻译 Americans eat ______vegetables per person today as they did in 1910a.twice as many as b.more than twice as many为什么不选A 看英文怎么说 大蜀山的描写 汉译英:文件权限文件权限的设置能最大限度保护公司文件的安全性和保密性.通过对每个用户帐号的设置来达到对文件权限的保护 have a chance to do sth造句 很急的 大家帮帮我 每个人心中都有一个属于自己的蜀山. 这句话中的蜀山是指什么意思? 汉译英:而每个文件的权限要求由文件的管理者来决定 可以看你吗英文怎么说 改装汽车的配件改装车的配件有哪几种? 用处? 全部列出来我说的是内部改装. 比如排气孔阿涡轮之类的. 我想把三菱改成更好的跑车,拿来彪 中译英:现在的权限不是我要的. have the chance ----------(to do/doing) something 有关于团结一心的词语 英语高手进,关于设备方面的中译英冷冻水系统目前存在三通阀阀芯泄露及进出反应釜门经常堵塞问供应商一直没能解决就是以上一段话要翻译的对啊不好意思是“问题”少打了个字 I would like three piece of bread 就three提问 根据句意及首字母的提示,把句子补充完整.1,The plane f__________ to Beijing every day.2,My father's sister is my a___________.3,June lst is C__________ Day. i think he may be in the classroom. No , he () be there. i saw him in the dining room just nowA: mustn't B: can't C: may not D: might not want,a,of,piece,bread,I (连词成句) 根据句意把句子补充完整秋天到了,校园的树叶飘落下来,这不是落叶,而是( ),这不是落叶,而是( ) 在括号里把句子补充完整, -Is Jack in the library -Maybe.I saw him( )out with some books just now括号中为什么是填go?just now不是非延续性动词吗?应该要接短暂性动词吧.saw him going out 看见他正在出去、 正在出去 这个动作, 要翻译身份证,请问合肥市公安局蜀山分局怎么翻译啊? Do you want__wine?填some还是any,为什么?我觉得应该填some,可是我不知道理由.我也找到下面这个例子.Penny and Sam don't have any wine,but they have some beer. white should be in hs office.l saw him there just nowmustmayshouldneed选哪个 合肥市公安局蜀山分局电话号码是多少啊?银行办卡,说没我这个身份证,我要打电话问问 ,,大侠门
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘