0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

api技巧集(四)

OBEason 来源:jf_88563726 作者:jf_88563726 2023-05-23 11:11 次阅读

超级链接效果

在很多共享软件的关于对话框里有一些模仿网页的超级链接,如主页URL或E-Mail之类的,当鼠标移到它上面的时候,文字变成红色的,当鼠标离开时,文字又变回原来的蓝色,如果用鼠标点击这个链接则会弹出浏览器窗口打开指定的URL或是运行默认的E-Mail程序撰写新邮件,就和真的超链接一样。你是不是也想在你的程序里做一个呢?其实,我们只要调用API函数ShellExecute和在鼠标移动时改变一下文字的颜色,就可以在自己的程序中出现这种效果。

首先新建一个工程,在窗体Form1上添加两个Label组件,它们的Name属性使用默认的Label1和Label2。

然后在Form1的OnCreate事件中加入代码:

Label1-$#@62;Cursor=crHandPoint;

Label2-$#@62;Cursor=crHandPoint;

Label1-$#@62;Font-$#@62;Color =clBlue;

Label2-$#@62;Font-$#@62;Color =clBlue;

Label1-$#@62;Caption="主页:初学者之家网站";

Label2-$#@62;Caption="E-Mail: fdlweb@sina.com";

再在Label1的OnClick(单击)事件中加入:

//蓝色的字请改成自己的主页地址

ShellExecute(Handle,NULL," http://fdlweb.myrice.com/",NULL,NULL,SW_SHOWNORMAL);

在OnMouseMove事件中加入:

Label1-$#@62;Font-$#@62;Color=clRed;

在Label2的OnClick事件中加入:

//蓝色的字请改成自己邮箱地址

ShellExecute(Handle,NULL," mailto:fdlweb@sina.com",NULL,NULL,SW_SHOWNORMAL);

在OnMouseMove事件中加入:

Label2-$#@62;Font-$#@62;Color=clRed;

最后在Form1的OnMouseMove事件中加入:

Label1-$#@62;Font-$#@62;Color=clBlue;

Label2-$#@62;Font-$#@62;Color=clBlue;

代码输入完了,按F9编译运行程序就看到效果了。

拷贝屏幕

BitBlt函数可以将一幅位图从一个设备场景拷贝到另一个设备场景,这个函数经常用在抓图程序和游戏编程方面,也可以用来做基于桌面的屏幕保护程序。下面让我们用BitBlt函数来做一个虚假桌面的程序:

首先,添加一个Image组件到窗体中,将窗体Form1的BorderStyle属性设为:bsNone。

接着在窗体的OnCreate事件加入程序代码

Left=0;

Top=0;

Width=Screen-$#@62;Width;

Height=Screen-$#@62;Height;

Image1-$#@62;Left=0;

Image1-$#@62;Top=0;

Image1-$#@62;Width=Screen-$#@62;Width;

Image1-$#@62;Height=Screen-$#@62;Height;

//这句代码就是将桌面拷贝到组件Image1中来存放,

// 其中GetDC(0)返回桌面设备的句柄(HDC)

BitBlt( Image1-$#@62;Canvas-$#@62;Handle,0,0,Screen-$#@62;Width,Screen-$#@62;Height,GetDC(0),0,0,SRCCOPY);

按F9运行,一个假的桌面就出来了,在这个“桌面”上怎么按鼠标都没有反应,可以用来捉弄人喔!。有些桌面的小游戏也是这么干的,你可以在这个程序的基础上加上更多的功能,如在窗体上加上Label组件和Timer组件,用Timer组件来控制Label组件在窗体上移动,再在窗体Form1的OnKeyDown事件和Image1的OnMouseDown事件中加入关闭窗口的代码“Close();”,最后将编译了的程序的扩展名改为scr,这就成了一个文字在桌面上乱动的屏幕保护程序了。

取得磁盘总空间和剩余空间

要取得磁盘总空间和剩余空间,最简单直接的方法是调用API函数 GetDiskFreeSpace。

GetDiskFreeSpace函数有5个参数,第一个参数是要判断可用空间的驱动器名,第二个参数是一个存放每簇扇区数的变量,第三个参数是一个存放每扇区字节数的变量,第四个参数是存放剩余簇数的变量,第五个参数是存放总簇数的变量。套用相应计算磁盘空间的公式即可得出指定驱动器的总空间或剩余空间。

磁盘总空间和剩余空间的计算公式分别为:

磁盘上剩余空间(字节) = 簇的扇区数 * 扇区的字节数 * 剩余簇数

磁盘上总空间(字节) = 簇的扇区数 * 扇区的字节数 * 总簇数

下面就是取得C盘的总空间和剩余空间的例子:

unsigned long Sectors,Bytes,Free,Total;

GetDiskFreeSpace("C:",&Sectors,&Bytes,&Free,&Total);

//可用空间(单位:MB)

int FreeKB = Bytes * Sectors * Free / 1024;

//总空间(单位:MB)

int TotalKB = Bytes * Sectors * Total / 1024;

ShowMessage("C盘的可用空间有:" + IntToStr(FreeKB) + "MB,总空间有:" + IntToStr(TotalKB) +"MB");

api技巧集(五)

提取图标

调用API函数ExtractIcon可以提取出在程序文件中的图标,它的头文件是shellapi.h,原型为:

HICON ExtractIcon

(

HINSTANCE hInst, //实例句柄

LPCTSTR lpszExeFileName, //要提取图标的那个程序的文件名

UINT nIconIndex //要提取的图标的索引

);

调用该函数时,参数hInst一般设为当前应用程序的实例句柄,如: Form1-$#@62;Handle。

参数lpszExeFileName为需要提取图标的程序文件的完整路径,这个程序文件可以是EXE文件、DLL文件、ICO文件等,只要是包含有图标资源的文件一般都可以提取图标。

当参数nIconIndex指定一个图标的索引可以返回指向图标的句柄,如指定的文件中不存在图标,则返回零,当参数nIconIndex设为-1,函数返回文件的图标总数。

函数返回的句柄可以赋给一个用TIcon类声明的变量,再使用该变量的SaveToFile方法就可以把图标保存出来。

例子:

TIcon *Icon = new TIcon();

AnsiString FileName = "C:\WINDOWS\SYSTEM\SHELL32.DLL";

int TotalIcon;

//得到文件SHELL32.DLL的总图标数

TotalIcon = (int)ExtractIcon(Form1->Handle,FileName.c_str(), -1);

//提取第一个图标,0为第一个,1为第二个,类推...

Icon->Handle = ExtractIcon( Form1->Handle, FileName.c_str(), 0);

//保存图标

Icon->SaveToFile("C:\1.ICO");

下面给出一个完整的图标提取程序源码。

这个程序需要四个按钮控件(Button)、四个文本标签控件(Label)、两个文本框控件(Edit)、一个水平滚动条控件(ScrollBar)、一个打开文件对话框控件(OpenDialog)、一个保存文件对话框控件(SaveDialog)和一个图片控件(Image),还有一个Panel控件是装饰用的。界面如图所示:

把各个控件排列好,再把四个Label控件的Caption属性修改一个,最后输入程序代码,运行程序,一个提取图标的程序就出来了,你以后也就不会为没有图标资源可用而发愁了。

程序清单(Unit1.cpp):

//--------------------------------------- ----------------------

#include $#@60;vcl.h$#@62;

#pragma hdrstop

#include "Unit1.h"

//----------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

AnsiString FileName;

TIcon *Icon = new TIcon();

int TotalIcon;

//----------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//----------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

Caption="图标小偷 1.0";

Button1-$#@62;Caption="选择文件";

Button2-$#@62;Caption="保存图标";

Button3-$#@62;Caption="保存所有";

Button4-$#@62;Caption="退出";

Edit1-$#@62;Text=0;

Edit2-$#@62;Text=0;

Image1-$#@62;Width=32;

Image1-$#@62;Height=32;

OpenDialog1-$#@62;Filter="可执行文件(*.exe,*.dll)|*.exe;*.dll|图标文件(*.ico)|*.ico|所有文件(*.*)|*.*";

SaveDialog1-$#@62;Filter="图标文件|*.ico";

ScrollBar1-$#@62;Enabled=false;

Button2-$#@62;Enabled=false;

Button3-$#@62;Enabled=false;

}

//----------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

if( OpenDialog1-$#@62;Execute())

{

TotalIcon = (int)ExtractIcon( Form1-$#@62;Handle, OpenDialog1-$#@62;FileName.c_str(), -1 );

if( TotalIcon$#@62;0)

{

if( TotalIcon$#@60;2)

ScrollBar1-$#@62;Enabled=false;

else

ScrollBar1-$#@62;Max=TotalIcon-1;

Button2-$#@62;Enabled=true;

Button3-$#@62;Enabled=true;

FileName = OpenDialog1-$#@62;FileName;

Edit1-$#@62;Text =TotalIcon;

Icon-$#@62;Handle = ExtractIcon( Form1-$#@62;Handle, FileName.c_str(), 0);

Image1-$#@62;Picture-$#@62;Icon=Icon;

Edit2-$#@62;Text=1;

}

else

{

ShowMessage("该文件没有图标");

}

}

}

//----------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

if( SaveDialog1-$#@62;Execute())

{

//保存图标

Icon-$#@62;SaveToFile( SaveDialog1-$#@62;FileName);

}

}

//----------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{

if( SaveDialog1-$#@62;Execute())

//提取所有的图标

for(int i=0;i$#@60;TotalIcon-1;i++)

{

Icon-$#@62;Handle = ExtractIcon( Form1-$#@62;Handle, FileName.c_str(), i);

Icon-$#@62;SaveToFile(SaveDialog1-$#@62;FileName+(AnsiString)i+".ico");

}

}

//----------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)

{

Close();

}

//----------------------------------------------------------------

void __fastcall TForm1::ScrollBar1Change(TObject *Sender)

{

Edit2-$#@62;Text=ScrollBar1-$#@62;Position+1;

Icon-$#@62;Handle = ExtractIcon( Form1-$#@62;Handle, FileName.c_str(),ScrollBar1-$#@62;Position);

Image1-$#@62;Picture-$#@62;Icon=Icon;

}

//----------------------------------------------------------------

判断驱动器的类型

使用API函数GetDriveType能判断一个驱动器的类型,该函数返回一个int型的值,当返回值为2时,是软盘;为3时,是硬盘;为4时,是网络映射盘;为5时,是光驱;为6时,是 RAM 磁盘;为其它值时,是非法的盘符。这个API函数包含在winbase.h头文件中,首先在程序头部加上语句:

include $#@60;winbase.h$#@62;

包含头文件,然后在程序中加入以下代码就可以判断驱动器的类型:

int drv;

//这里的"C:"为要判断的盘符

drv=GetDriveType("C:");

switch (drv) //判断drv的值

{

case 2 : //DRIVE_REMOVABLE

ShowMessage("软盘");

break;

case 3 : //DRIVE_FIXED

ShowMessage("硬盘");

break;

case 4 : //DRIVE_REMOTE

ShowMessage("网络映射盘");

break;

case 5 : //DRIVE_CDROM

ShowMessage("光驱");

break;

case 6 : //DRIVE_RAMDISK

ShowMessage("RAM 磁盘");

break;

default :

ShowMessage("这个磁盘不存在!");

break;

}

注:case语句后的数值也可以用注释后的常数替换。如2可用常数 DRIVE_REMOVABLE 来替换。

审核编辑黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • API
    API
    +关注

    关注

    2

    文章

    1436

    浏览量

    61232
  • 函数
    +关注

    关注

    3

    文章

    4117

    浏览量

    61547
收藏 人收藏

    评论

    相关推荐

    API技巧集(二)

    (一)不规则窗口 Windows提供的只是标准的矩形窗口,要想建立一个不规则的窗口就需要调用API函数来实现。建立一个不规则的窗口,一般是先用创建区域的API函数建立一个不规则的区域,再用API函数
    的头像 发表于 05-22 16:49 742次阅读

    vc++ api函数 (Windows API大全)

    Windows API大全,本书主要介绍VC++里API函数及其用法-WindowsAPI Daquan, the book introduces VC Lane API function
    发表于 10-14 11:45 32次下载

    JDBCTM 2.0 API

    The JDBCTM API is the JavaTM standard call-level API for database access. This documentcontains the final specification of the JDBC 2.0
    发表于 10-14 17:42 6次下载

    什么是3D API

    什么是3D API              API是Application Programming Interface的缩写,是应用程序接口的意思,而3D
    发表于 12-25 10:52 557次阅读

    iMX6_2D_API_Hardware_and_Platform_Independent_API_for_i.MX6_2D_Graphics

    iMX6.2D.API,Hardware and Platform Independent API for i.MX 6 2D Graphics
    发表于 12-29 14:41 12次下载

    分析API都有哪些特点

    好的API是怎样的,应该具备哪些特点,作者对此进行了详细说明,并把API比作产品,主张编写API时从用户的角度换位思考。 如果用户通过他们自己的代码与你的代码进行交互,那么你将需要构建一个AP
    发表于 09-28 17:38 11次下载

    如何使用API_api接口有什么优点

    关于什么是API,通俗的解释应该是:一个组件(或程序库)提供给开发者进行编程使用的,通过代码可以与之沟通的入口。比如说你下载了一个控件包,通过阅读说明你知道应该如何创建上下文、初始化、设置属性、调用、回调、事件处理,这些就是这个控件包的API
    发表于 01-04 11:36 2w次阅读

    The MySQL C API 编程实例

    在网上找了一些MYSQL C API编程的文章,如《The MySQL C API 编程实例》,看了后觉得还是写的不够充分,根据自己经验又扩充了一些知识,希望对需要调用到MYSQL的C的API的朋友有所帮助,附例中的环境为cen
    发表于 04-13 15:01 5次下载

    什么是API,不同场景中的API

    当公司构建他们的应用时,他们把它们设计成一组交互的API。最容易理解的例子是Lyft(或者Uber)。你可能想在Lyft应用中做一些事情,它们在幕后都会触发不同的API
    的头像 发表于 08-10 11:20 1869次阅读

    API+DevOps:华为云API Arts一体化平台,端到端呵护您的API

    API+ | 以API-First理论为基础,以API为核心构建数字化生态 摘要:华为云API Arts是API全生命周期一体化协作平台,支
    的头像 发表于 02-17 19:05 965次阅读

    API+DevOps:华为云API Arts一体化平台,端到端呵护您的API

    华为云API Arts是API全生命周期一体化协作平台,支持开发者一站式高效实现API设计、API开发、API测试、
    的头像 发表于 03-01 15:45 614次阅读
    <b class='flag-5'>API</b>+DevOps:华为云<b class='flag-5'>API</b> Arts一体化平台,端到端呵护您的<b class='flag-5'>API</b>

    文内福利 | 三重好礼,邀你成为API Explorer体验官!

    华为云API Explorer为开发者提供一站式API解决方案统一平台,集成华为云服务所有开放APIAPI Explorer服务,包括API
    的头像 发表于 03-25 07:55 381次阅读

    api接口怎么使用

    本文就从API接口的维度,浅析API的概念以及为什么要了解它 一、API的概念 API,官方定义为应用程序编程接口。就是把是一些预先定义的接口,用来提供应用程序与开发人员基于某软件或硬
    的头像 发表于 05-24 14:44 1187次阅读

    常见的api接口漏洞有哪些

    错误消息可帮助 API 使用者排查其与 API 的交互问题,并允许 API 提供者了解其应用程序的问题。但是,它也可以揭示有关资源、用户和 API 底层体系结构(例如 Web 服务器或
    发表于 07-17 16:29 238次阅读

    华为云发布 CodeArts API,为 API 护航

    4 月 10 日,华为云正式发布 API 全生命周期管理一体化协作平台 CodeArts API,支持开发者高效实现 API 设计、开发、测试、托管、运维、变现的一站式体验。以 API
    的头像 发表于 05-09 23:17 291次阅读
    华为云发布 CodeArts <b class='flag-5'>API</b>,为 <b class='flag-5'>API</b> 护航