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

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

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

 
回调(CallBacks)
所谓回调,就是你自己定义一个函数,并告诉Windows何时为何调用.你可以写一个有特定数量和类型参数的函数,然后告诉Windows何时调用,并传递给它所需的参数.Windows就会调用你定义的函数,处理参数,并给你返回值.

回调的一个典型应用是从Windows获得连续的数据流.这里是一个需要回调的函数的声明:

Declare Function EnumWindows Lib "User32"ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

第一个参数是你的回调函数的地址,第二个参数是你想传递的的任意数值.该值将被传递到你的函数,于是你就知道了它要调用什么.

VB 5.0已经提供了一个很有用的操作符 AddressOf ,可以得到一个函数的地址.当你调用一个函数时它只能用在参数的前面,下面这种用法是错误的并且会导致出错:

FuncP = AddressOf MyFunction

因此你必须这样调用EnumWindows函数:

Success& = EnumWindows(AddressOf cbFunc, 58&)

你必须也要自己写回调函数.问题是有很多不同类别的回调并且有各种各样的参数,有关这些参数的描述可以在SDK帮助或MS SDK文档中找到.这里是一个回调的声明:

Function cbFunc (ByVal Hwnd, ByVal lParam) as Long

这里是一个回调的例子:

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA"(ByVal hwnd As Long,ByVal lpString As String,ByVal cch As Long) As Long

Success& = EnumWindows(AddressOf cbFunc, 58&)

Function cbFunc (ByVal Hwnd, ByVal lParam) as Long

If lParam = 58 then 'enum windows

Str$ = Space(255)

Ret& = GetWindowText(Str$, Len(Str$))

Debug.Print Left(Str$, Ret&)

End If

End Function

这个例子将列出窗口的标题,(不包含子窗体)

窗口程序

Windows并不知道事件. 这些是VB特有的隐藏Windows获取你的窗口发生事件的真正方法的一种方式.VB很像是一个将Windows语言翻译成VB语言的解释器.

但是事实并非如此,你很快就会遇到.设想你想知道用户何时加亮了菜单选项(不是点击,只是加亮即选择了)VB并不提供这种事件,但你可能见到其他的程序,但你浏览它的菜单时状态栏会出现相应的文字.如果他们能,你为何不能?

OK,这里是大致的真实情况.每个窗口都有一个特殊的程序叫做窗口程序.它实际上是一个回调函数.该函数将在你的窗口发生事件的任何时间发送消息.这样当用户加亮一个菜单项时就会发送一条消息(WM_COMMAND).

那为什么我看不到这条消息呢?这是因为是VB创建窗口程序而不是你.当Windows发送消息时,该程序将为之分派特定的事件,并将其参数转换为比较容易用的事件的参数.但是在有些情况下,它会忽略有些消息而不能收到真实的输入.如果你真的想得到这些消息,你必须对你的窗体进行子类处理,我们将在另外一个主题中谈到.

这里是一个回调窗口程序的声明:

Function WindowProc(ByVal Hwnd As Long, ByVal wMsg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long

第一个参数指定窗口的句柄,第二个参数是消息的标识符(如WM_COMMAND或WM_MOUSEMOVE),wParam和lParam时两个32位的数值,它们的意义依赖于消息的类型.
技术新突破:手机和平板可远程控制PC,Chrome Remote Desktop亮相 物联网高速公路上,快数据如何驱动分析 苹果或将使用雅虎的搜索引擎,抛弃谷歌 百万用户规模的系统如何扩展 大数据需要软件定义存储 倒计36小时!2014中国Spark技术峰会即将召开! 设计师专宠,Startup强大的UI设计框架 走进金山云:从技术走向服务 Qt Creator 3.1.0发布,全面支持iOS、Android、WP Google大中华区总裁石博盟与中国大学生畅谈科技与创新 阿里云:从防到攻,深入浅出DDoS 大数据处理分析的六大最好工具 微软:Windows Phone开发者可回复用户评价 不断缩水后的微博上市首日大涨19% 曾一度涨超40% Snapdragon LLVM编译器全新升级 支持骁龙64位处理器 EDP:基于Node.JS与NPM的企业级开发平台 想改变世界,先改变自己——知名Hacker、发明家Mitch Altman专访 《近匠》iHealth,健康大数据助力硬件“破壳” 一周消息树:如何做到每天写代码? 一周热点:微软SQL Server 2014三大新特性 《Make》创始人Dale Dougherty:全民创客 DevOps正在扼杀程序员? OpenStack新版本:新增近350个功能,修复Bug超2900个 【走近讲师】易欢欢:数据对接和后台是互联网金融的技术最难点 最火HTML5 JavaScript游戏引擎:国外篇(二) 挑战最强大脑——来自全球的14个编码社区 摩尔定律让位于贝索斯定律 InPaaS:新一代云计算应用平台 【技术博客推荐】樊哲谈机器学习算法与Mahout Scala 2.11.0发布 仅支持Java 8部分功能 诺基亚彻底“卖身” 变“微软移动” 如何定义一个按钮的ID 机子无故重起并显示begin dump physic memory 请问高手,我从OnStkDataOK(var Msg: TMessage);中得到的Msg.LParam值是真实的值还是值的地址? 如何实现Form中的下拉列表框可以输入,又定位的功能呀,急呀,多谢了! VB的API文本查看器,如何使用??? 很简单的问题:在表单上有n个复选框,通过一个按纽,我想获取那些复选框被选中,并返回它们的name数组! 关于组网的一些问题 别人抱怨接分难,我抱怨散分效率低 想考高程但不知买什么参考书大家帮忙 菜鸟问题:各位大侠帮忙看看 如何给panel加滚动条,请教 关于程序编译的问题: 问一个数据库文件的问题! PB7 连接 MSSQLServer 6.5为什么需要那么长的时间并且内存要占用100多M? 关于使用VB6创建的控件后的部署问题 Delphi与bcb有何联系与差异 关于WIN2000网络上的问题 盼高手来解决,阿菜勿进 我用PHP通过ADO连接ACCESS 为什么i=很大 怎么样改变statusbar的某个Panels的字体颜色 如何制作MID窗体的背景图片平铺? sqlserver有一个带参数的存储过程,为什么不能生成DW.?? 急(送100分):多个image控件如何用imagexxx使用? 如何得到CPU的时钟频率? 各位大佬,0x1 是什么? 一个页面只让一个用户来修改 请问哪儿有Lotus Notes C API的教程?以及要进行编程必须进行哪些配置? PB7连接MSSQLServer6.5的时候为什么需要那么长的时间和占用100多M的内存? 推荐在代理服务器上安装什么邮件网关软件? 在线等待 请各位帮助 如何得到开机时间? 我想把smalldatetime类型显示为“yyyy_mm_dd 00:00:00” 急须一个完全免费的MP3刻录软件 怎样修改xml的节点的值? Tabpage(子项)可以改变颜色,但Tabcontrol(父项)改变不了颜色。高手帮忙。 MM说:“你可真够没良心的!”! (邀请水园MM请参与) 测试流程! 在用ADO时如何判断在所取得的记录中,值为null的的情况 急(送100分):多个image控件如何用imagexxx使用? 关于数组的问题。 Weblogic 死锁的问题 想到亚信去,请各位兄台给点建议!(有分!) 请问能不能用System.Drawing对象在一个页里里画多张图? 索引和自增字段 关于对话框? 求能人?或给思路 请问哪儿有Lotus Notes C API的教程?以及要进行编程必须进行哪些配置? 100分求助:怎麼判斷數據庫服務器存在與否? JUnit重复测试的问题 请问一个hyperlink简单问题 求助:datagrid中控件事件的使用问题? 在C中写文件的内容,在线等待!!! 煤老板打麻将赌博赢211万 公安局申电信诈骗出新花样 装主刀医生发短信索情侣喝多了吵架动手 误伤隔壁桌客人致陈宝成完整录像 还原陈宝成被刑拘事情宁波一名男子救跳江自杀女孩 做完好事宁波一辆工程车倒下40多吨渣土差点活酒店司机撞伤人被判全责 伤者丈夫上门超级高铁时速1223公里 成本仅为高保安曾捐肾给工友治病 靠名声骗钱数十法官设计引出老板帮助小伙拿到被拖欠工宁波外海一名柬埔寨籍船长天热中暑半身煤气瓶突然爆炸 两人受伤严重被烧伤进文革红卫兵向受害者道歉 沉重忏悔罪行二代身份证存缺陷 挂失后还能被使用台湾失智老夫妻 演绎我的世界只有你的网络名人共守七条底线 微博大V传播社印度潜艇爆炸18人被困 俄军工产品质浙商解救妻女牵出万人传销团伙 涉案金新手湖州高速上开路虎飙到196码被记潜水打麻将求清凉 交流仅仅靠手势北京群体自杀事件伤者身着“哈尔滨铁路李东学刘恺威哥俩好网络“黑手”周禄宝被提起公诉 曾实名2017年将计入总分“南京发布”微信功能多,可查菜价南京入夏啦,“闷热模式”继续黄金难现大涨行情69只个股中期业绩现代快报“读者嘉年华”重磅来袭公交司机也恼了,这下闹大了秦小天扬剧个人专场周日上演端午小长假,南京增开81列临客加速核销不良贷款五星打响空调旺季首场价格战带着砳砳去旅行,赢青奥开幕式门票7月起,南京的哥的姐穿“制服”上岗机构6月策略曝光无缘亚洲杯决赛住豪宅租“宝马”显摆自己很成功上海飞乌鲁木齐航班备降南京续:乘客谎六合15块闲置地改成停车场冒出明代“小个子”石翁仲
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘