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

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

Docker与微软合作 支持Windows Server 企业号热问热答——来深圳微信开发者大会聆听一线讲师的实战分享 AngularJS 1.3.0正式发布 超光速发展! 学个痛快!十款不容错过的Swift iOS开源项目 HTML5:助力智能电视生态实现新跃迁 MDCC 2014移动开发者大会公布全部议程 求更密集!Apple Watch SDK将于11月正式开放 【答疑】微信开放平台开发者资质认证 专访Informatica亚太和日本区副总裁Murray Sargant:中国公司正考虑数据资产货币化 Facebook又开源:让iOS应用界面极致流畅的ASDK框架 一周消息树:盘点史上最具毁灭性的软件Bug 微信公众平台设备功能支持个人开发者接入 2014中国移动开发者大调查第三批获奖名单曝光 微信企业号上线,带你看看它的真面目! OpenStack Juno版本发布——支持Spark和NFV 【十问十答】对话Go语言开发团队 苹果要求、Android开始,64位时代真的来了! MDCC 2014产品与设计论坛:带你发现产品之美 Java开发者值得关注的7款新工具 助力国产移动产品出海,UCloud部署北美节点 Zack Parker:用EC2在Cotap上打桩 用卫生棉杀敌冲关!两个高中女生的创意游戏 专访《Java程序员修炼之道》作者Ben Evans:保守的设计思想是Java的最大优势 Google收购Firebase 帮助程序员快速开发出移动App和Web App 微信支付开发关键点技术解析 游戏任玩!开源虚拟现实头戴式设备Open DoVision MDCC大会召开倒数10天 看Twitter、Facebook和国内“BAT”三大巨头最新动态 《近匠》Wijmo 5 CTO:从Web到移动,我的25年编程生涯 重复充电、防丢失!多功能智能行李箱Bluesmart 【设计经验传承】图标设计初阶要先型 “光年”光纤路由 支持千兆网络的家居中心 救就我,为什么Frame的客户区变小了?关于切分窗口 怎样查找某一个目录下一个表是否存在? 请问有用过李阳疯狂英语的朋友吗?请说说到底怎么样? 我想向各位大侠请教一个问题? 如何屏蔽TEXTBOX的回车响应? 关于《各位学习编程的目的是什么》的总结 m_pusrrcdset->m_pDatabase->ExecuteSQL("")为什么不行?老是ASSERT错误 请问我刚入bcb的大门,有什么好的参考书可以看看吗? 有没有人知道计算机等级考试四级怎么查分啊? 如何将几个数组的信息写成一个.txt文本文件 笔试题请教? 请教一个小问题! 好难呀好难呀!!!!! 今天狠了狠心买了一本<>,花了我十分之一的工资!心疼啊!散点分! 请问有谁知道如何在C#中使用DirectX? 我在Picturebox中用Picture1.print打了200行数据,可我只能看到前20行 pb数据窗口中的列名在win2000 server里为什么显示不了中文? God save me,help...... tcl手机所使用的是那种操作系统,能否告知小弟,重分相谢! 异常中的问题 刷新对话框的背景图片(基于对话框的程序,而且刷新不只一次)! 请问? 急急急!!上网后的图标不见了!!! 为什么我写了个JSP写入数据库中的中文在数据库中查看是乱码? 用vb制作动态网页 怎么给分给别人? 怎么获得光驱的倍数,设定光驱的倍数啊 怎么破解WIN2000的管理员密码!急!!!! SDK、API、MFC到底是什么? 本人想做给一个网络管理方面的软件,谁能跟我讲讲这方面的原理么? 请问有谁知道如何在VB.net中使用DirectX? 求救:我在 JAVA 中用 TextField 输入文字时发现,在汉字方式下敲不了标点符号,而我用 VC 的 EDIT 却可以,为什么? 大虾帮帮忙,一个关于bpl的问题,十万火急!能给的分我都拿出来了 请问怎么截获对动态链接库的调用? 关于数据库的问题!我搞了几天拉!天啊!我不想学java拉!! 请问我在window98上写html,asp文件,需要安装那些软件,pws我已安装,其它还要什么 请问有谁知道如何在VC.net中使用DirectX? 一个关于realplayer的问题! 请问怎样记录程序运行时间呢,记得好像有一个函数.... ?求一道数学思想题 各位大虾,我想在DELPHI5.0中调用W9X下的超级终端中的传输命令来传输文件??? ■■请教不知怎么回事,我现在打开*.txt文件,WIN98系统提示框:windows不能发现sysexplr.exe,如何解决呀?请热心的C++同事解决■■ 请问有谁知道如何在.net中使用DirectX? 到那里学习SQL语言 关于树!他妈的树! 关于黄色网站的另外一个问题 请问在VB中能否实现COMBOX的自动保存功能? 如何include根目录的文件 OO之路(三)--Persistent Objects 难题!如何在IE中打开一个独立的窗口,同时状态栏里没有显示? 一帮蠢货,水平滚动条都解决不了!就会讨论非技术得问题 关于数学物理的1kg/m3=?g/cm31楼的好像答错了 圆中国梦走复兴路作文【800字】不要复制的 地球大气主要是由那些成分组成的?各主要成分作用是什么 15.5KN/m3等于多少g/cm3 500立方分米=( )立方米 空气是由哪些成份组成的? 我想要"古铜色"_(小麦色)皮肤``!该死的`!我的皮肤` 黑不黑` 黄不黄` 真不知道算什么` 我特想要小麦色(古铜色)的皮肤` 很性感又冷酷` 哎` 难道除了天生的之外` 就没有别的办法能使肤色变 共铸复兴路,同圆中国梦 为主题的作文 800字 5立方米60立方分米=( )立方米=( )立方分米 小麦色和古铜色哪个更好一点、更帅气一点.我是一个男生、不属于健将型皮肤颜色 我不要太粗犷的颜色啊、也不要太深太深的颜色、匀和一点的那种。就是追求的 健康肤色 、比常人稍稍深 500立方分米=()立方米 2升=()立方分米 5立方米5立方分米=()立方米 某地风速为v=20m/s,设空气的密度为ρ=1.3kg/m³,如果通过截面面积S=20m²的风的动能全部转化为动某地风速为v=20m/s,设空气的密度为ρ=1.3kg/m³,如果通过截面面积S=20m²的风的动能全部转 请问这是古铜色还是小麦色? 求以‘’走复兴路,圆中国梦‘’为主题作文一篇不少于800字 跨经度最多的大洲和大洋是?扬沙、沙尘暴发生在什么季节?赤道为轴向南北方向有哪些气候类型.分布的特点? 比较1kg/m3和1g/cm3,谁的密度大 3.5立方米=( 3 )立方米( 500 )立方分米为什么 赤道穿过大洲大洋 1kg/m3=0.001g/cm3怎么化过来的啊要仔细描述啊!本人不知道怎么换过来的?怎么1kg换g变小啊? 求作文《走复兴路,圆中国梦》1000字. 细胞分裂三次为什么是2^3将15N标记DNA的大肠杆菌培养在14N培养基中,经三次分裂后含15N的DNA占DNA总数的多少? 物理单位转换 1KWh=3.6×106J 1m/s=3.6km/h 1g/cm3=103kg/m3 1kg/m3=0.001g/cm31m/s=3.6km/h 如果是2m/s转化成km/s 怎么算呢? 海洋大气防腐油漆有哪些突出的性能? 细胞分裂4到底多大为什么游侠的才1.4G 而游民的4.7G 1Kg/m3= g/cm3 1m/s= km/h 海洋大气防腐油漆的防锈性能好吗? lng加气站就是气化站么? 是海洋生态系统的自动调节能力强还是森林生态系统调节能力强?为什么? 海洋大气防腐油漆不能机械除锈怎么办? 海洋气候河湖对人类分别有什么作用 谁知道鲨鱼对于海洋生态的平衡所起的重要作用吗? 9.4立方米等于几立方分米 欧洲气候具有显著的海洋说特点请你分析一下哪些因素起了重要作用 海洋生态系统 森林生态系统谁自动调节能力强 6立方米3立方分米=( )立方分米(过程) 细胞分裂时产生的子细胞与母细胞结构和功能相同吗?试着分析一下原因.今晚就要. 海洋生态系统 森林生态系统 自我调节能力哪个强最强的是不是生物圈? 走复兴路 圆中国梦 征文该怎么写啊,我不要作文,要结构为鼓励广大同学积极参加全国青少年爱国主义读书教育活动。要求每位同学在认真阅读《走复兴路,圆中国梦》高中生读本的基础上, 在细胞分裂过程中,有的子细胞长到与母细胞一般大小时能继续分裂;而有的子细胞则发生变化,形成具有不同__________和__________的细胞,这种过程叫做____________ 森林生态系统和海洋生态系统那个调解能力更强 500立方分米=0.6立方米怎么求比值 一个细胞分裂5次后产生几个子代细胞 为何海洋有吸收二氧化碳的作用植物呼出二氧化碳也会吸收氧气,那么他的吸氧量是多大啊,听说一棵大树的吸氧一年才是6Kg啊?那么是不是海洋才是真正的贡献啊我想知道植物的贡献到底有多 走复兴路 圆中国梦征文急……700字 厄尔尼诺现象发生时,太平洋赤道地区的大洋环流与大气环流是怎样的. 把二氧化碳直接通入海底有什么影响 6立方米50立方分米=()立方米=()立方分米 圣婴现象出现时太平洋赤道海区的大气是怎样流动的 海洋吸收二氧化碳"从大气中吸收二氧化碳,同时释放氧气,在这一点上,海洋有着和森林一样的作用.海洋仿佛一只巨大的二氧化碳沉淀池,目前已经储存了1500亿吨的碳;仅在去年一年,海洋就吸 《走复兴路,圆中国梦》征文怎么写?是怎么写,不是范文! 描述正常年和厄尔尼诺年时赤道附近太平洋地区海水温度的分布特点,说出其上空大气环流的状况及对印度尼西亚和厄瓜多尔气候的影响 海洋中铁等元素的增加可使浮游植物增加,从而消耗大气中大量的二氧化碳,这有利于缓解( )这一环境问题. 走复兴路圆中国梦征文700 关于地理厄尔尼诺现象 太平洋西岸气候变化! 作文——走复兴路 圆中国梦 800字.明天就要交了!是要一篇叙事文!明天就要交了啊! 静电喷涂和空气喷涂的用途和领域请讲解下静电喷涂与空气压缩喷涂设备的用途和所应用的领域! 1kg/m3等于多少g/cm3 关于海洋吸收二氧化碳的问题,这是正确的吗?海洋可以吸收大量的二氧化碳,随着海洋生物种类的减少,吸收二氧化碳的能力逐渐增强,对于现在日益严重的温室效应应有所缓解.这是正确的吗? 走复兴路 圆中国梦征文主要写些什么?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn