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

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

Snapdragon LLVM编译器全新升级 支持骁龙64位处理器 EDP:基于Node.JS与NPM的企业级开发平台 想改变世界,先改变自己——知名Hacker、发明家Mitch Altman专访 《近匠》iHealth,健康大数据助力硬件“破壳” 一周消息树:如何做到每天写代码? 一周热点:微软SQL Server 2014三大新特性 《Make》创始人Dale Dougherty:全民创客 DevOps正在扼杀程序员? OpenStack新版本:新增近350个功能,修复Bug超2900个 【走近讲师】易欢欢:数据对接和后台是互联网金融的技术最难点 最火HTML5 JavaScript游戏引擎:国外篇(二) 挑战最强大脑——来自全球的14个编码社区 摩尔定律让位于贝索斯定律 InPaaS:新一代云计算应用平台 【技术博客推荐】樊哲谈机器学习算法与Mahout Scala 2.11.0发布 仅支持Java 8部分功能 诺基亚彻底“卖身” 变“微软移动” 10款高效简化移动开发过程的工具 《近匠》AppCan:打造成云生态的移动PaaS平台 WhatsApp壮举:活跃用户超五亿、日7亿幅照片和1亿个视频 如期而至,GCC 4.9.0正式版发布! 【走近讲师】孙昌勋:容联云通讯构筑通讯能力云平台生态圈 最新版本的Hive 0.13发布,增加ACID特性 开发中的“软”与“硬”:高画质移动游戏开发之道 从国际编码竞赛来看编程语言受众度 AMD迎接变革:加速OpenCL的未来 角逐Hadoop市场,Cloudera与Hortonworks竞争白热化 OpenStack将提供对Docker的支持 Facebook Q1财报:营收25.02亿美元、59%来自于移动 黑客们盯上了卫星,IOActive的惊人发现 开发汽车应用之前,你必须了解的7件事 立即给分,寻求操作Formula One 的代码!谢谢 斑竹, 斑竹, 你等我结了帖子再删, 好吗? COM,COM,COM问题急救,快快快 送给phoenixdyy吧, 不要客气呀 在sun网站上到那个地方下栽 Java 类文件? 送给cathy的, 不要客气 我老老实实的学习去, 学不成不会回来的, 大家顺利 为什么我的这个php不执行? 有关CASE工具 请问怎么样将VB程序打包?就是生成一个不需要源代码和没有VB编译器的环境下可以运行的可执行程序。 关于如何做OEM 请教大师 这是所谓的“情”吗?谁碰到过如此谎谬的事~~“我们这样算什么?!” 分值,就那么重要吗?大家来探讨一下! 请问如何用TC或BC或VC实现字符界面下文本阅读器(请尽快复) lemonade请进 请教水平考试 请赐教如何制作WINDOWS下的电子行程表(请尽快复) 号外!!号外!!谁能认真点回答我这个问题? 学了C和JAVA以后,我该学哪中语言? 这么晚了,还有谁在水园? 如何用JSP实现聊天是中的自动滚屏功能? 我的FlashGet,NetAnts全都没有办法下载了!!!急死我了!!! 探讨用专业论坛和新闻组来促销,那位兄弟有经验? 一个简单的问题,大家来看罗。 如何禁止EDIT控件输入? To:pbdesigner兄弟没找到解决的办法,只好修改程序流程避开这个问题8-( 小弟该如何学习? Actinia在吗?问你个问题! 今天又有人送分,he he! VC快玩完了!!!!改学BCB!!!! 一个简单的问题,关于cin的 怎样向listview发送消息? N人上班,按照白、夜、休三班倒,如何每月按此顺序自动排班 TreeView接点如何响应单击事件? 我的一本c++教程,刚刚下载了练习答案,不会用, 请问这是个什么东东问题?(只有这么多分了。。) 一张表内关键字如何互换? 本人想插入一个记录,但该记录的一个字段是一个已经输入的值,你说该用什么函数处理呀?本人想了一个早上也想不出个原因来!!!! 今天真热,一大早爬起来去游泳,感觉真好。这里有喜欢早晨去游泳的吗? DCOM问题。Win2000下的服务器应怎样配置,才能使客户机调用服务器端的DCOM。 再不帮我我就死定了 我要哭了! 痛苦:如果你的头儿叫你帮他修改他写的一大段垃圾代码,你会怎么做办? 工程为什么不能打包? 高手快来。 请问怎么安装PB 那有Acrobat下載,不是Acrobat Reader Foxpro的ODBC,是不是真的就不支持update当前游标的记录....? 怎么在SQLSERVER2K里用存储过程得到的完整的Xml文件,我想用jsp取出来? 关于ASP “他喜欢和老人们交谈、下象棋.”这句话怎么用英语翻译? 先正达与拜耳哪个好 在南京路你遇上一个老外,怎么用英语告诉他怎么去上海博物馆?快!明天就要交作业了! 北京市中国的首都吗?用英语怎么翻译 血糖仪,杭州哪里有卖拜耳的血糖仪的啊? 英语翻译英语翻译 英语翻译外国的一个朋友给我发快递.结果小弟很尴尬不知道自己家的英文地址 麻烦帮忙翻译下北京市海淀区太平路47号院 10号楼 甲门 401跪求一个准确无误的翻译~中国北京市海淀区太平路47 英语高手帮我翻译一个地址,请把这个地址翻译成英文:北京市石景山区永乐东小区40楼2门101室.邮编100040 世博会口号世界在你眼前我们在你身边 英文怎么讲? 中国的首都是北京,我等不及要去哪儿翻译成英语 英语翻译邮编710048中国陕西省西安市碑林区东关南街古迹岭小区请问这个地址英文邮编写的时候是这样写:Shaanxi Province,P.R.China 710048,还是Shaanxi Province,710048P.R.China 东关南街的英文是 South Dongg 2010年上海世博会志愿者的口号为:“世界在你眼前,我们在你身边.”请你用简洁的语言诠释口号的含义.求求你们了,有谁会的说一下啦,再追分好不好? 北京是中国的城市,中国的首都.翻译成英文 中国地址翻译 北京市丰台区西罗园三区20号楼1004号 的英文翻译怎么翻?另外,邮编怎么书写 世界在你眼前 我们在你身边是上海世博会志愿者的口号 这对你的成长有何启示RT、 九年级英语教材翻译unit 2 16页短文翻译 题目是He used to cause a lot of trouble. 为什么历代皇帝都要把北京选为首府?能不能再全面点,具体点? 英语翻译韩国京畿道龙仁市处仁区白岩面白岩里409号统一大厦(或hana大厦)309号金龙云 九年级英语9单元sectionB3a翻译关于茶的那个版本! 英语翻译“中国 江西省 南昌市昌北经济开发区 江西财经大学麦庐园静庐E栋620” 英语翻译 求 新目标九年级英语unit14的Reading部分的翻译!急·50分 英语翻译您是昨天那个卖酒的小女孩吗?我是昨天向您要电话中国人.您忘记了吗?电话号码 上面补充一下 英语翻译 新目标九年级英语p137 Unit14 sectionA翻译 英语翻译舟山市定海区临城街道建设大厦C幢13楼 英语翻译:中国的名胜古迹你都听说过哪些? 新目标英语八年级上册unit2 B翻译3a..3b..4 用英文翻译地址香港新界荃湾新村街40号2楼 英语翻译大雁塔小雁塔钟楼大唐芙蓉园兵马俑 英语翻译 英语翻译1.每天要查阅单位重要工作呈阅件,把工作落实到人到位2.活到老学到老将是不懈的追求.3.尽快的熟悉环境,尽快的熟悉人员,尽快的熟悉业务,做到嘴勤、眼勤、手勤. 英语翻译:北京的历史很悠久,还有名胜古迹多,可以吃到很多美食. 人教版七年级上册英语unit2,sectionB 2b的意思Hi,I am Jenny.Here are two nice photos of my family.My grandfather and grandmother are in the first photo. These are my parents,Alan and Mary. In the next picture are my brothers,Bob and Eric. 英语翻译Electronic technology is facilitating thisgrowth by offering access to fare and hotel information and online reservationservices .In Goa,villagers forced to walk to wellsfor their water had to watch as a pipeline to a mew luxury hotel was 英文翻译. 刘德华要在北京开演唱会吗? 英语翻译 英语翻译My college life,let dream fly. 你打算到哪儿度假?英语翻译 英语翻译when people use words and expressions different from the ''shandard language '' ,it is called a dialect .american english has many dialects .especially the midwestern ,southern ,African American and spanish dialects .even in some part of 我和我的家人住在一起.英文翻译 山东省青岛市经济技术开发区北江路7号507室 英文这么翻译 初一英语下册第4单元Reading的翻译 英语翻译“五年前我住在北京”和“我住在北京五年了”分别怎么翻译 “五年前我住在北京”这么翻译行吗——I was living in beijing five years ago 他还想去别的什么地方吗?英文翻译~ 苏教版初一英语上学期第四课reading课文翻译 我们大多数住在像这样的高楼 英语翻译? “去任何自己想去的地方”英语翻译优美点如题 初一英语下册第三单元Reading翻译 英语翻译 英语翻译so the difference between $125 and $134 may be viewed as risk premium you may choose to pay to lock in the future tuition at year amountif cash flow regularities are present within the stream,the use of shortcuts,such as finding the prese 英语翻译初一下册11单元selfcheck3 1.北京市朝阳区十里堡一号院恒泰大厦B座7016室 2.商务部 3.工程部 这三个都是做名片时要翻译成英语的,大 英语翻译Investors (or fund managers) make a living by managing a selection of shares from various companies and hoping for a profit when share prices move. 英语翻译”我在等待生命的光芒,生命却在等待我的迷茫.“这句话的翻译 你想象中的拜耳 西单商业街和王府井商业街的区别?2个地方离得远吗?哪个商业街消费水平更高?西单商场的人气旺还是王府井旺? 英语翻译:我想和老人住在一起. 血糖仪拜耳的好不啦? 如何写关于上海南京路的英文简洁(要50个单词!是初一英语水平的)也不要太简单.要把南京路的地址和特点写清楚!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn