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

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

TREEVIEW的使用-Delphi资料 TreeView在电信综合统计管理系统中的应用-Delphi资料 VB6.0动态加载ActiveX控件漫谈-Delphi资料 捕捉来自 Thread 的异常-Delphi资料 定制Speedbar-Delphi资料 动态产生构件并相应事件-Delphi资料 对Borland可视部件的一处改进-Delphi资料 控件使用技巧-Delphi资料 改变VCL的行为--一个使用可视化元件的实例-Delphi资料 具有不同字体的列表框-Delphi资料 快速大量地更改控件内容-Delphi资料 快速动态创建MenuItem-Delphi资料 利用Delphi 5中调用Excel 97 利用Delphi的Tbitmap控件抓取屏幕图象 利用delphi美化你的菜单 面向组件的系统开发方法-Delphi资料 强大的树型编程控件TeeTree1.01-Delphi资料 确定MEMO控件中的当前行和列-Delphi资料 让字体左、右对齐-Delphi资料 如何给TListBox加上水平的滚动条?-Delphi资料 如何快速选择一个组件的父亲-Delphi资料 如何用Delphi编写自己的可视化控件 如何用VB创建控件-Delphi资料 生成程序组和项-Delphi资料 实现超级链接-Delphi资料 实战Delphi数据网格色彩特效 使dbgrid的某几笔资料变色-Delphi资料 树形图(Treeview)的使用概述-Delphi资料 透明FORM-Delphi资料 为列表框添光彩-Delphi资料 限制FORM的大小-Delphi资料 怎样使用SQLServer 存取Map X 的空间表? 为什么我自做的控件在IE中出错(在线等)控件刷新的问题 辞去版主职务,永别IT 不放分不快(恭喜大力 DD和liuri JJ) windows32位平台 打开数据库 祝大家中秋快乐,放分庆祝! 请教 救命啊!2k中了W32.HLLW.Lovgate.G@mm病毒啦 如何使用asp。net? 我怎么在一个页面里做了操作后,同时打开的另一个窗口也同时就这个操作的影响 如何,用jndi连接oracle数据库呢?? 如何访问其他进程的内存? 38部《真实自拍影片》,精彩! 中秋节 散分贴三连发 第二贴 寻找压缩控件! 一个简单的SQL语句! 關於框架 请版主帮忙(怎样将asp中的动态数据填充到有一定格式的EXCEL模板文件中) 一个简单的问题,急! 为大家吐血献上:余世维《成功人士讲座》录像 Tomact设置问题 很简单的“异常”问题 linux vi的绝对路径是什么? 为我即将离开PB和IT行业,散分! 今天是中秋节,还是单身的水友进来坐坐。 哪有Crysrept下载?? Session为什么掉了??急切等待!!! struts中一个页面如何显示多个FormBean? 过节了,散分,祝大家中秋快乐!!!!!! 請問TForm中相當於MFC中OnIdle()的event是什麼 数据库问题,急!!急!急!急!急! CISCO2600的ISDN拔号不会自动断线,怎么办? 谁知道怎么验证一个用户名和一个密码是不是在WINDOWS2000中添加过的?而且正确? 。。。谁能给我发一个“智能狂拼2”的下载连接地址 请求--网页评比规则? 在visual.net上无法调试存储过程。急。求救 asp加密程序 我用SQL server+DElphi中的ADO做数据应用程序,数据库备份后,怎样实现数据库的恢复? 贴子太多了,看不过来了,大力liuri出来讲讲 sqlserver 用 jdbc出错 ,Microsoft][SQLServer 2000 Driver for JDBC]Error setting up static cursor cache 如何在C#中用代码控制本地FTP服务打开和关闭?99分,中秋快乐. 关于dll的问题,在线求教 昨晚,我抱了我MM一下!开心呀!散分! 有什么软件可以使上网不受防火墙的限制? 一个C的图形函数,请问怎样用的? 数据库查询语句执行错误 web页面的activex控件怎么调用服务器上的动态连接库?? 中秋散分 【泰坦】祝大家中秋节快乐!(1) 纯jsp聊天室的页面刷新问题 两个婆娘一面锣,三个婆娘一台戏.什么意识 前人栽树的下一句是什么 典型的互补色光是哪几对 求助色光照射物体呈色问题我最近看色彩构成的书,发现书上说的1.青色、红色、绿色光照射在黄色物体上青色被吸收,而红绿两种色光被反射,为什么呢?记得物理上说的是反射同种色光啊,应该 降的多音字组词 一幅水彩画只有红灯照射的环境下,可以看到什么颜色的色光 现在是初冬还是深冬啊,今年这个冬天大概是什么时候到什么时候啊 初冬已经颇冷,颇冷的意思 {暗藏希虚} 请问有错字吗? 星斯里面哪一个是错别字吗? 死婆娘的反义词是什么?我想找一个词,和死婆娘相对的,气势要更壮一点的~是和我老公对骂用的~ 唐家璇:中日关系深层次原因在于彼此认第九届北京―东京论坛26日在北京开幕查尔斯不想当国王? 英媒爆王储担心被河南“猪蹄店要账横幅”事件:欠款已全英媒称斯诺登一机密文件披露美监听35中欧推动世贸组织在MC9上达成早期收福岛近海发生7.1级地震 最大观察到欧洲多国一致声讨美国监听事件 默克尔报效桑梓浙商情深 前三季浙商回归项目福岛近海发生7.1级地震 最大观察到马耳他总统阿贝拉会见杜青林墨西哥一劫匪抢劫保镖手表 被后者开枪中国032潜艇火力超强:能客串战略核同济大学师生成功放飞世界最大遥控电动马英九鼓励青年跨地区交流:拓展眼界 检方二度提讯 台北地铁杀人魔郑捷将进“考试院“、“监察院“存废 “蓝委“北京多区县今日下午将出现冰雹天气(图浙江高校颠覆“上了大学就解放” 推“浙江高校颠覆“上了大学就解放” 推“中国更多民众以“微善举”参与慈善汇聚梁振英:不会撤回新界东北发展拨款申请异界散仙梵天仙道无限之血脉进化都市启明星天封孽界招个神仙当夫婿英雄无敌之魔兽帝国网游之女神的游戏异世魔医官道弯弯异能狂想岑溪旅游瑞金旅游大荔旅游井陉旅游永春旅游台怀镇旅游乡城旅游白际旅游安化旅游东沙群岛旅游文县旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘