Delphi中API编程编译实现

摘要:
1、 状态键检查许多流行的软件编辑窗口(包括Delphi代码编辑窗口)底部有一个状态栏,用于显示一些状态信息。您需要在程序中创建一个256字节的缓冲区来存储键盘上每个键的状态(最简单的方法是声明一个TKey BoardState变量)。您可以根据缓冲区中相应位置的值判断键盘状态。

Delphi作为一种面向对象的可视化开发工具以其开发程序的高速度和编译代码的高效率受到广大编程人员的青睐。尽管Delphi已经提供了非常强大的开发组件(VCL),但灵活使用API函数一定可以使你的程序增色不少。

一、状态键的检查

不少流行软件的编辑窗口(包括Delphi的代码编辑窗口)的底部都有一个状态条用来显示一些状态信息,比如当前光标的位置等。

通常键盘的状态键包括[NumLock],[ScrollLock],[CapsLock]和[Insert]这四个键,在编辑窗口中显示状态键的状态可使你的界面更友好,更有利于方便用户。

要实现状态键检测这一功能,你可以使用微软提供的API函数:GetKeyboardState().对于这个函数,建议大家自己动手查具体含义,不过认识些英语的朋友硬是从字面理解也能知道其大致含义吧。当我们调用GetKeyboardState()函数时,你需要在程序中开辟一个256字节的缓冲区用来存储键盘上各个键的状态(最简单的方法你可以声明一个TKeyBoardState变量)你可以根据缓冲区中相应位置的值来判断键盘状态,下表显示了系统常量和其相应的按键。(你如果想查看所有的键值列表可以在Help菜单选择WindowsAPI中输入关键字VirtualKeycodes,然后按下Show键)

常量按键名称
  VK_INSERTInsert]键
  VK_NUMLOCKNumLock]键
  VK_CAPITALCapsLock]键
  VK_SCROLLScrollLock]键

键盘缓冲区每一位都有特定的格式,对于状态键来说,最低位是1时表示状态键处于 ON状态,你可以使用delph i提供的Odd()函数来确定这一位的状态。为了使程序显示正确的状态键的状态,你需要定期调用GetKeyboardState()函数来不断的查询键盘状态,而实现这一功能最简单的方法是使用Timer组件。下面举一个小例子来说明如何具体实现这一调用功能,在这个例子中我们将检查[NumLock]键的状态并把它显示在屏幕底部的状态栏。

下面就是具体的操作方法:新建个工程并分别托放StatusBarTimer控件在主窗体上双击Timer控件,在弹出的代码编辑窗口处添加以下代码

procedure TForm1.Timer1Timer(Sender: TObject);

var

 KeyStates: TKeyboardState;

begin

 GetKeyboardState(KeyStates);

 if Odd(KeyStates[VK_NUMLOCK])then

    StatusBar1.Panels[0].Text := ''

 else

    StatusBar1.Panels[0].Text := '';

end;

运行查看结果并人为改变NumLock状态测试。同理其它键盘状态你可以如法炮制

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

许多程序在特定的控件上都有提示框,当鼠标在这些控件上停一定时间以后就可以显示提示框。在Delphi中实现提示框是非常容易的,只要设定相应的属性即可。但通常的提示框都是以黄色矩形框的形式显示在对应控件的右下角,以下这段代码说明了如何使用API改变Delphi中提示属性的一些特性。

把下面这句代码加入到主窗体的Oncreate事件中,加入代码后的主窗体的FormCreate过程的代码如下所示:

procedure TForm1.FormCreate(Sender: TObject);

begin

 ……

Application.OnShowHint := GetHintInfo;

end;

然后自己编写GetHintInfo过程:

procedure GetHintInfo(var HintStr: String; var CanShow: boolean; var HintInfo: THintInfo);

下面是该过程的实现部分:

procedure TForm1.GetHintInfo(var HintStr: string; var CanShow: boolean; var HintInfo: THintInfo);

var

 II:TIConInfo;

 Bmp: Windows.TBitmap;

begin

 with HintInfo do

 begin

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

FlashWindow(Form1.Handle,True);

if HintControl=nil then Exit;

    HintPos := HintControl.ClientToScreen(CursorPos);

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

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

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

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

    if II.hbmColor=0 then

      //这里注意下,想要改变Hint提示框的位置。试着改变HingPos的值(效果验证)

Inc(HintPos.Y,Bmp.bmHeight div 2) //如果光标不包括彩色位图,增加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中滚动纵向滚动条时页码序号总是显示鼠标在左方,用以上代码实现这一功能可以说是易如反掌。

注:本人也是个Windows编程的新手,对于上面的这些代码是我在百度上搜索到后自己重新编译后修改的,希望能给新手朋友们提供些方便。

免责声明:文章转载自《Delphi中API编程编译实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在应收应付系统凭证做冲销后,如何取消冲销?SQL Server 在windows server2008*服务器远程连接设置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Ztree 触发onClick事件

一.思路 1、利用 getNodeByParam 等方法找到你需要选中的节点2、利用 selectNode 方法选中节点3、直接调用 callback.click 二.代码 var treeObj = $.fn.zTree.getZTreeObj("divId"); var nodes = treeObj.getNodesByParam("code", "...

Android编程 获取网络连接状态 及调用网络配置界面

获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能。 Android平台提供了ConnectivityManager 类,用于网络连接状态的检测。 Android开发文档这样描述ConnectivityManager的作用: Class that answers q...

爬虫技术(六)-- 使用HtmlAgilityPack获取页面链接(附c#代码及插件下载)

菜鸟HtmlAgilityPack初体验。。。弱弱的代码。。。 Html Agility Pack是一个开源项目,为网页提供了标准的DOM API和XPath导航。使用WebBrowser和HttpWebRequest下载的网页可以用Html Agility Pack来解析。 HtmlAgilityPack的文档是CHM格式的,有时会无法正常阅读CHM格式...

如何高效判断java数组是否包含某个值

在java中,我们如何判断一个未排序数组中是否包含一个特定的值?这在java中是一个频繁非常实用的操作。那么什么样的方法才是最高效的方式?当然 ,这个问题在Stack Overflow也是得票率非常高的一个问答。得票率排在最前的几个答案给出集中不同的方法,但是他们的时间复杂度却相差甚远。本文将详细的探讨主流的方法,并给出他们各自的时间损耗。四种方法List...

iOS性能优化之内存管理:Analyze、Leaks、Allocations的使用和案例代码

最近接了个小任务,和公司的iOS小伙伴们分享下instruments的具体使用,于是有了这篇博客...性能优化是一个很大的话题,这里讨论的主要是内存泄露部分。 一. 一些相关概念 很多人应该比较了解这块内容了...可以权当复习复习... 1.内存空间的划分: 我们知道,一个进程占用的内存空间,包含5种不同的数据区:(1)BSS段:通常是存放未初始化的全局变...

5、用python写一个自己的网页

1、新建一个文件夹 ,在里面新建一个文件cgi–bin的文件 2、插入代码; print ("Content-type:text/html") print () print ('<html>') print ('<head>') print ('<meta charset="gb2312">') print ('<...