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

在VB中使用API函数 (之一)

HTML文档下载 WORD文档下载 PDF文档下载
在VB中使用API函数 (之一)

 
什么是API?

API(Advanced Programmers Interface,高级程序员接口)(注:API实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB中也可以这么说吧!)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以Windows告诉发生了什么.

这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法.

这也就是说,你用VB写出的每行代码都会被VB转换为API函数传递给Windows.例如,Form1.Print...VB 将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数.

同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Button_Click).

API函数包含在Windows系统目录下的动态连接库文件中(如User32.dll,GDI32.dll,Shell32.dll...).

API 声明

正如在"什么是API"中所说,API函数包含在位于系统目录下的DLL文件中.你可以自己输入API函数的声明,但VB提供了一种更简单的方法,即使用API Text Viewer.

要想在你的工程中声明API函数,只需运行API Text Viewer,打开Win32api.txt(或.MDB如果你已经把它转换成了数据库的话,这样可以加快速度.注:微软的这个文件有很多的不足,你可以试一下本站提供下载的api32.txt),选择"声明",找到所需函数,点击"添加(Add)"并"复制(Copy)",然后粘贴(Paste)到你的工程里.使用预定义的常量和类型也是同样的方法.

你将会遇到一些问题:

假设你想在你的窗体模块中声明一个函数.粘贴然后运行,VB会告诉你:编译错误...Declare 语句不允许作为类或对象模块中的 Public 成员...看起来很糟糕,其实你需要做的只是在声明前面添加一个Private(如 Private Declare Function...).--不要忘了,可是这将使该函数只在该窗体模块可用.

在有些情况下,你会得到"不明确的名称"这样的提示,这是因为函数.常量或其他的什么东西共用了一个名称.由于绝大多数的函数(也可能是全部,我没有验证过)都进行了别名化,亦即意味着你可以通过Alias子句使用其它的而不是他们原有的名称,你只需简单地改变一下函数名称而它仍然可以正常运行.

你可以通过查看VB的Declare语句帮助主题来获取有关Alias的详细说明.

消息(Messages)

好了,现在你已经知道什么是API函数了,但你也一定听说过消息(如果你还没有,你很快就会)并且想知道它是什么.消息是Windows告诉你的程序发生了哪些事件或要求执行特定操作的基本方法.例如,当用户点击一个按钮,移动鼠标,或是向文本框中键入文字时,一条消息就会被发送给你的窗体.

所有发送的消息都有四个参数--一个窗口句柄(hwnd),一个消息编号(msg)还有两个32位长度(Long)的参数.

hwnd即要接受消息的一个窗口的句柄,msg即消息的标识符(编号).该标识符是指引发消息的动作类型(如移动鼠标),另外两个参数是该消息的附加参数(例如当鼠标移动时光标的当前位置)

但是,当消息发送给你时你为什么看不到呢--就象有人在偷你的信一样?请先别恼火,让我告诉你.

小偷其实是Visual Basic.但它并没有偷走你的信,而是在阅读了之后挑出重要的以一种好的方式告诉你.这种方式就是你代码中的事件(Event).

这样,当用户在你的窗体上移动鼠标时,Windows会发送一条WM_MOUSEMOVE消息给你的窗口,VB得到这条消息以及它的参数并运行你在事件MouseMove中的代码,同时VB会把这条消息的第二个32位数(它包含了x,y坐标,单位为像素(Pixel),每个位16位)转换为两个单精度数,单位为缇(Twip).

现在,如果你需要光标坐标的像素表示,然而VB已经把它转换成了缇,因此你需要重新把它转换为以像素为单位.在这里,Windows给了你所需要的,但VB"好意地"进行了转换而使你不得不重新转换.你可能会问--我难道不能自己接收消息吗?答案是肯定的,你可以使用一种叫做子类处理(Subclass)的方法.但你除非必须否则最好不要使用,因为这与VB的安全程序设计有一点点的违背.(注:子类处理确实有很大的风险,但如果使用得当,是很有用处的.不过有一点一定要注意,即千万不要使用VB的断点调试功能,这可能会导致VB崩溃!)

需要补充说明的是:你可以发送消息给你自己的窗口或其他的窗口,只需调用SendMessage或PostMessage(SendMessage会使接受到消息的窗口立刻处理消息,而PostMessage是把消息发送到一个称为消息队列的队列中去,等候处理(它将会在该消息处理完后返回,例如有些延迟)).你必须制定接受消息的窗口的句柄,欲发送消息的编号(所有的消息的编号均为常量,你可以通过API Text Viewer查得)以及两个32位的参数.
软件开发实践的24条军规 思科 IBM 微软等巨头联合开发开源SDN项目OpenDaylight 巾帼不让须眉:2012年度云计算领域Top 10女性 中移动全力推进NFC 5月起乘公交可刷手机 支持Android与iOS,Qt 5.1 Alpha全新亮相 Google Play:劣质Android应用已无藏身之地! 360推出信用网站认证开放平台 联合百家协会围剿钓鱼网站 经验分享:百度测试架构师眼中的百度QA(一) 在线旅行服务行业开放API带来的新机遇 专访:悬疑恐怖游戏Year Walk美术及音效设计师 解密:微软都柏林数据中心的神秘“免费冷却”装置 云计算如何影响数字化营销? 榜单:十位帮我们打理数据的存储大佬 OpenStack Grizzly版发布 Comcast、CERN成为新会员 谷歌携Blink来势汹汹 WebKit将成明日黄花? 星巴克与苹果合作 顾客可免费下载付费App 微信回应信令争议 将启动2.5G网络优化计划 凤凰网CTO吴华鹏离职 先后供职长达10年 外媒:开发者每周编码时间仅19.1小时 AppGratis CEO现身说法:应用被苹果儆杀始末 一个Web设计师眼里的云计算 戴尔高管:服务器业务领先惠普五年时间 Hoodie:基于JS与CouchDB的超快速Web开发框架 设计优秀API的五大规则 盘点英特尔IDF2013第一天:技术产品新趋势 英雄组队去打怪!Nimble Quest开发团队访谈 云通讯平台打造本土Twilio 被逼无奈?传微软或明年秋发布iOS和Android版Office 欧洲各国政府将向大众开放公共数据 访联想云存储罗予晋:优化MooseFS,共建生态系统 磊友创始人赵霏:关于HTML5与Flash争执之我见 有个关于数据窗口compute的问题请教? 如何返咽一個二維數組? htm里面调用一个jsp页。用javaScript 怎么实现。 怎样添加*.dll文件,如cj60lib.dll,系统自带的吗? 关于记录修改的SQL语句!!! VC的DLL文件怎样在BC中使用?我试过不行 JAVA问题请教 打包运行错误can't start main setup program! 如何把表单上单选框组的内容传给报表啊 iptable怎样限制用户上网? 靠,我的表不能排序啊.....郁闷.... iptable怎样限制用户上网? 求教:输入1个集合,输出它的子集 请问,linux下能用access吗? 问一个“一个页面只能有一个form的问题“ 有关主板BIOS ROM的奇怪问题 请教各位高手,在VB中添加数字排列组合的代码如何编写?多谢!(在线等) # # # # # 200分诚心求教(由于限制,只能先放100),哪位能解决小妹这个问题啊 # # # # # 请问谁知道oracle中计算查询时间的命令? 有关操作系统的几个问题?感谢大家的指点? 大学四年心得-转帖 ORACLE 在本机WIN2000 上装了服务器端后,还需要装客户端才能进行数据库的一般操作吗? 关于PLC向计算机发送数据的问题。 构造函数? # # # # # 200分诚心求教(由于限制,只能先放100),哪位能解决小妹这个问题啊 # # # # # 据大力新闻中心消息:SQLServer版是CSDN气氛最好的版块。 在弹出窗口时出现问题 请多多指教:帮我推荐一本Asp.net+C#的书,入门和稍微难点的。谢谢了 想学java的库类 请各位大大推荐一本书 请问在VC6中如何调用chm帮助文件 简单的控件问题 ADO调用存储过程(ORACLE),用CommandText的问题 字体固定后,所有字符(包括汉字)的高度都相同吗? 请问applet和application之间有什么不同呢? 字体固定后,所有字符(包括汉字)的高度都相同吗 为什么看帖不回帖? 关于用c#操纵word的问题 为什么在WIN下可以,在LINUX下不行呀? 大数除法 那位高手解答一下 键盘被锁定!!!急 CSDN现在是怎么了!!!登录不了,想办法进来了背景又是一片白,左边菜单列表又不见了 找到新东家,祝各位兄弟中秋节快乐! 有喜欢骑自行车的吗,进来聊聊,你的车多少钱啊 怎么用javamail发送html页面的邮件? 请问各位一个网页路径问题,谢谢了。急急!分不够再加,本人在线等候!!! 简单问题 为什么我用FLASH做出来的GIF格式的图很大?一些最简单的都有3MB左右!谢谢高手来指教!! 很奇怪的问题,redhat9+adsl+iptable老是丢包,而且达到30%,在2k下没有这样的问题 2太电脑连网,为什么双击网络邻居的时候跳出对话框说无法浏览网络? 菜鸟请大家看看这个程序错误出在那? 怎样才能做到真正意义上的沉默是金?比如说少说废话,说出来就一语惊人.不会因无聊的事情发笑,看得透事物的本质等 68是什么意思 2406, 如果我是00,你愿意做我的68吗 s谁知道AA啊去 求68个成语+意思意思越短越好 语文作文前言的格式是怎样的是不是 标题(空两格)----XXXXXXX表示的是前言,而不是下文 寂( )无声 ( )( )万分,怎样填空? 第68句的意思,简单的概括出来 两小儿辨日给我们了什么启示? 两小儿辨日给了你什么启发 高维生的《二胡》 1、为什么说欣赏二胡的时间最好在傍晚?2、第四段描写了江南特色景物,表现了琴声的什 中方严重关切美监听活动报道 要求美方46名中国与印度非法采金者在加纳被捕浙江实现县县电气化 镇村电气化比日痴情男等红灯偶遇女子生情愫 疯狂跟南非“刀锋战士”谋杀案再添非法持有弹76件日本国家重要文化财产下落不明 宠物可充当锻炼器材 带狗做瑜伽成欧美巴黎迪士尼出事故致5岁男童落水 已无《世界新闻报》窃听案8名被告中有3人日本政府将向救童中国留学生颁发感谢信数据显示日本近5年间借智能手机偷拍案为什么月薪6000买不起车?这些真相导演诺兰抽了谁的耳光?国产日系车到底靠不靠谱?看完这几个事关于走出自卑的一些个人总结投资者60亿被骗血本无归,中国平安回“故障率”低 “死亡率”高 为什么国毁人不倦的赞助留洋即使是双十一 这些硬通数码也统统不打对中国字画投资市场的理性思考7个数字读懂国内P2P网贷行业的9月找一个“养”你的男人无限残说斗破苍穹超级盗贼驻马太行侧暗黑破坏神之英雄巨龙战纪雄霸天下体尊网游之天下无双布衣官道重生之天龙前传北伐纪念碑旅游白鹤岗炮台旅游孙中山纪念碑旅游洪圣庙旅游快哉亭公园旅游解放军庙旅游无锡太湖度假村旅游芜湖滨江公园旅游五凤溪旅游留法勤工俭学纪念馆旅游山田牛奶园旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘