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

在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位的参数.
陈昊芝:腾讯!让我说你什么好? Top Paid与Top Grossing定价策略的差异 Android版百度云推送正式发布 为何开发者应推动公司开源? 从AppGratis被下架说起,苹果或将再次付出代价 58同城的“烦恼”——8K月薪安全工程师引发的入侵 软件开发实践的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第一天:技术产品新趋势 gicq玩家的间题 请taglis2002来借分。 急!Edit中输入日期的问题 急!DBGrid的栅格问题 为啥Oracle中还有近5G的表空间,当插入某表时却提示要增加数据文件,而别插入别的表却没问题(送分的) 有关中文显示的问题 谁用过CSTreeBean,有问题请教 VB里是不是没有从一个字符串中选出数字的函数? 一个关于高位低位的问题 请问用Dbexpress如何生成一个临时表 经典的“HELLO WORLD” 错在哪里? 有人在我的机器上安装了特洛依木马程序,我删不掉,怎么办啊??? 20 分:help me!!!!!!!!!! 我可以报考高程吗? 请问北京的pb程序员们,一般大家是怎么联系新工作的?上网?参加招聘会? 如何能动态地将dbf文件转为mdb文件格式? 从Sybase Sql Anywhere移植到Oracle有什么注意的事项? 一个关于mfc的疑惑 沙尘暴的原因。 win proxy的设置问题 北京和租房 如何安装JiveSofeWare下的CVS 初学者 奇怪的问题:水晶报表? 受不了了,居然能在资源管理器里面实现Flash动画预览 怎样把SQL Server中的数据库导出成*.sql文件? 如何向listctrl中添加一个控件? 关于读取文本文件中字符串的问题 怎样判断编辑框里面的内容是数字还是字母?相当急! 为什么那么多的帖子都找不到了啊!!!怎么回事!! 明知不可为,坚持不屑 是傻 或 痴 ,还是有毅力 我的这个发送邮件功能不能用吗。请看? 关于SQL2000的日期的显示问题! <<<<行者兄请赏笑话 prog_st(st) 接分: 给哥们帮大忙了. 鼠标的点击范围 Object类型不包括Value属性么?为什么我的程序会出错? MSHFlexGrid的数据显示问题.(泰山,巴顿你们谁会啊?) 用VC编译Perl 源程序的详细步骤? <<<<行者兄请看笑话 一下却提示newwnd.mydiv对象找不到,搞不懂,为什么啊! MSHFlexGrid的数据显示问题.(泰山,巴顿你们谁会啊?) <<<<<行者兄请看最后一个笑话 [转载]一篇让语文老师看了抓狂的文章! 四则新闻 急急:关于 Strconv( )****** 一下却提示newwnd.mydiv对象找不到,搞不懂,为什么啊! 为什么retrieve可以用数组作为参数,而sql语句里不能用数组? 如何在html页面中嵌入一段用xslt显示的xml文档? 如何只允许操作本应用程序窗口,不允许执行其它任何程序,并且不允许关闭本应用程序窗口 请问哪儿有关于MIS开发的书籍卖?请问哪个兄弟有看见,请告诉我书名好吗? 金属性,非金属性,为什么?1、元素的金属性可以通过置换水中或酸中的氢的难易程度或最高价氧化物对应的水化物的碱性强弱来判断;为什么和置换氢有关?为什么和最高价氧化物对应的水化 如果要增加棋子滑动的距离,你又有什么办法 怎样计算电路中通过的电荷数 布里渊区边界方程:n*(k-n/2a)=0的几何意义和物理意义 棋子如果要增加滑动距离,有什么办法 求Cl-和K+的有效核电荷数还有屏蔽常数怎么求?上网查了 看不太懂比如 Mg 网上是这样算的1*2+0.85*8+0.35*1 可是Mg不是1s2 2s2 2p6 3s2吗 不应该是0.35*2吗? 第七英语 有没有什么办法能使对讲机通讯距离增加? 怎么计算多肽的净电荷数 英语第七道? 请问用什么办法增加电磁铁吸引距离电磁铁不改变线圈匝数,不改变电压、电流,怎样改变铁芯形状增加电磁铁吸引衔铁的距离, 锗二极管的具体参数,最大正向电流,正向导通电压,反向电压等在为一个电池充放电电路寻找合适的二极管,使用其单向导通性能,因流过的电流最大时达1.2A,所以选择了1N5399硅管,但发现压降太 英语翻译 要缩短与发达国家间的差距,发展中国家应该采取哪些措施? 二极管正向电压从0.7V增大15%时,流过电流增大? 英语书第7页 求下面电路的电压和电流值,设二极管是理想的 形式电荷具体怎么算?最好多举几个例子 英语第七题 理想二极管接成如下图所示电路,求流过二极管VD1、VD2的电流各为多少?输出电压V.为多少? 【讨论】如何通过循环伏安曲线计算电荷密度Qd 倒摄抑制心理学知识 请高中物理帝帮忙解答关于电路中“通过电荷多少”的含义.假如说一个电路中“通过”了6C,是指的是“某一横截面”在一定时间内通过了6C的电子的意思?可是,电路中不是处处都有电子的流 电荷如何计算 什么是点动控制 高中物理:连通电路后,电路中定向移动产生电流的电荷是导线中的吗? 全部形状(英文)! 政府控制房名词解释名词解释 什么叫布拉格反射?最好能举例说明 造型英文怎么写 电荷量是指( )单位( ) 每一主族从上到下,金属性逐渐增强,非金属性逐渐减弱,这句话对的?,最外层电子数不是不变吗? 我真在工作英语咋说 收益性支出工商企业会计 的 为什么最外层电子数越少其元素金属性越强?谢谢~~~ 还有那个什么原子序数越大原子半径越小? 谢谢~ 反射什么意思 简单滑动平均法某公司按周记录正义的周销量周次 1 2 3 4 5 6 7 8 9 10 销售量 4232 4560 4321 4612 4624 4589 4633 4627 4668 4671试选择合适的移动步长,用简单滑动平均预测方法推算第十一周的销量. 石墨烯的光学性质有没有人知道相关文献啊?石墨烯计算的相关性质,有没有实验和计算的相关文献提供哦? 一共有七个字母第三个字母为L有关职业的英文单词? 何谓“滑动平均”? 石墨烯概念股一览 涉足石墨烯的上市公司有哪些 导线中有电荷运动就形成电流,为什么? 金属性越强越容易失去电子吗?非金属性越强,越容易得电子吗?如果以上成立的话,能否说成越容易失去电子,金属性越强 越容易得电子,非金属性越强 话说最近石墨烯那么火,为嘛没人用石墨烯的触摸屏?同上提问. 导体运动产生感应电流的问题就是第14题 请问什么是滑动平均?它是怎么计算的? 网络名词解释.LS是啥意思?LZ是楼主吧. 请问怎么样测定二极管的静态电阻和动态电阻? 金属性与非金属性哪个是失电子能力 非金属性最强的是什么元素?金属性最强的是什么元素?判断金属性和非金属性强弱的具体标准是什么? 二极管的电阻与电流想知道输入恒定和电压,多个二极管串连,每个二极管上的电流和电压是否一样?如果并连电流和电压又如何?你说的,我是想知道,窜连和并联 各二极管商的电压是否一样 怎样做数据的滑动平均滑动平均中的系数是怎么确定的?请高人指点非常感谢 zk1275722756朋友的热心帮助 可以从哪些方面比较元素的金属性?可以从哪些方面比较元素的非金属性? 二极管正向动态电阻的大小,随流过二极管电流的变化而变化,是不固定的吗? 只有金属才易失去电子?只有非金属才易得到电子么?氧化性就是非金属性?还原性就是金属性么? 元素的金属性、非金属性到底指什么? 家具的英文是什么 滑动平均法用什么程序 什么是元素的金属性?什么又是元素的非金属性? 化合物的核电荷数怎么算例如氧气,氢氧根离子,水
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘