Delphi中API编程-编译实现

转载 2012年02月01日 02:27:02

======================================================
注:本文源代码点此下载
======================================================

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

一、状态键的检查

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

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

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

常量按键名称

vk_insert[insert]键

vk_numlock[numlock]键

vk_capital[capslock]键

vk_scroll[scrolllock]键

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

下面就是具体的操作方法:新建个工程并分别托放statusbar和timer控件在主窗体上双击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编程的新手,对于上面的这些代码是我在百度上搜索到后自己重新编译后修改的,希望能给新手朋友们提供些方便。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/

DELPHI下的Winsock编程(二)--一些基本的API函数

勿在浅沙筑高楼。在谈论TServerSocket等组件编写之前,这里先对Winsock中一些基本概念和API函数做一个简单的说明。 一、定址         要通过Winsock建立通信,必须了解如...
  • erhushenrui
  • erhushenrui
  • 2008年02月29日 15:53
  • 1900

delphi利用Window API编写基于socket的tcp程序

客户机和服务器可用互相通讯。 直接贴出代码吧,没有优化,代码可能有些冗余,只是实现了互相发送字符串的功能。仅供参考。服务器端:unit untserver;interfaceuses  Windows...
  • yuehaiyang
  • yuehaiyang
  • 2007年11月09日 12:58
  • 2590

在Delphi编程中使用C语言代码

在Delphi编程中使用C语言代码   ...
  • iiprogram
  • iiprogram
  • 2007年01月25日 11:24
  • 1869

浅谈Windows API编程 (这个经典)

原文地址:http://blog.sina.com.cn/s/blog_46d85b2a01010qpt.html WinSDK是编程中的传统难点,个人写的WinAPI程序也不少了,其实之所以难...
  • qq_24880013
  • qq_24880013
  • 2018年01月11日 17:38
  • 221

Delphi使用Windows API 创建最基本的窗口程序Hello,Windows演示

program HelloWin; {$WARN SYMBOL_PLATFORM OFF} uses Windows,Messages; var WndClass:TWndClass; ...
  • MaxWoods
  • MaxWoods
  • 2012年12月12日 23:50
  • 3066

Delphi API HOOK 完全说明

一、关于 API Hook1. 什么是 API Hook不知道大家是否还记得,在 DOS 系统中编程,经常会采取截取中断向量的技术:我们可以设置新的中断服务程序,当系统其他的程序调用这个中断时,就让它...
  • qiume
  • qiume
  • 2010年04月01日 18:33
  • 4360

delphi打印机编程

Delphi中获取打印机设备名和端口名uses Printers;{$IFNDEF WIN32}const MAX_PATH = 144;{$ENDIF}procedure TForm1.Button...
  • happy_tiger
  • happy_tiger
  • 2007年11月19日 22:41
  • 3448

游戏引擎中的通用编程技术

游戏引擎中的通用编程技术 引言 你是否正在考虑构建一个游戏引擎呢?你对如何构建一个游戏引擎是否已经有了一个明确的计划呢?你是否已经对如何组织游戏引擎各个模块之间的关系有了一个通盘的考虑?如果没有,...
  • tcx19900712
  • tcx19900712
  • 2013年12月17日 20:34
  • 1234

Delphi exe + bpl 简述

例:exe+Base.bpl+Function.bpl+A.bpl A.bpl要继承Base.bpl,操作步骤: 1、在A.bpl中的Requires中加热Base.dcp 2、在A.bpl中新...
  • gjtao1130
  • gjtao1130
  • 2016年04月13日 15:11
  • 409

delphi不同计算机程序间通信用TServerSocket实现

在Delphi中,用ServerSocket与ClientSocket组件,建立TCP/IP通信非常容易。 Delphi安装 Tclientsocket, Tserversocket控 添加方法:...
  • Michael__mai
  • Michael__mai
  • 2016年01月13日 00:20
  • 1168
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi中API编程-编译实现
举报原因:
原因补充:

(最多只允许输入30个字)