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

VB如何提高调用WINDOWS API函数编程技巧

HTML文档下载 WORD文档下载 PDF文档下载
VB如何提高调用WINDOWS API函数编程技巧
石油大学(北京)
顾岱鸿
---- 做为一个不断进取的编程者,我们常常不满足于编程语言所提供的一般功能,总是希望能够实现一些特殊的功能,这有时不但是我们程序的要求,有时也是编程者心理上需要(试想,还会有什么比在深夜中巧妙解决一个难题而更令人兴奋呢?)。VisualBasic,做为一个当前最流行的快速编程环境,就给我们提供了实现这些目标的平台,事实上,它无限扩展的API接口可以实现所有WINDOWS下可以实现的功能。然而对于初学者来说,"浩瀚"的API函数总是显得那么神奇与不可琢磨,因此在实际应用过程中不能够灵活应用。下面我将结合两个小例子来示范介绍VB中调用API函数的步骤和功能,并总结说明在实际工作中如何提高这方面的技巧。例子在WINDOWS98下采用VB6.0编译。

一.限制鼠标的移动
---- 有时我们的软件要求用户在未完成某一任务时,鼠标不能移出当前活动控件,换句话就是将鼠标限制在控件的内部,直到任务完成或用户中断为止。这个功能借助API函数实现起来思路很清楚,代码也很简洁。其思路是先确定当前鼠标的位置;然后确定当前活动控件的大小;最后将鼠标限制在活动控件内。(下面忽略项目建立等过程)
---- 1.建立一个新项目:新窗体为form1,在form1上添加一个commandbutton,设置其Name=CMButton1;Caption="将鼠标限制在此按钮中"

---- 2.拷贝API函数和POINTAPI结构:打开VB6.0自带的API浏览器,调入WIN32API.txt文件,复制以下结构和函数声明到form1的声明部分:

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type POINTAPI
x As Long
y As Long
End Type

Private Declare Function ClientToScreen Lib
"user32" Alias "ClientToScreen" (ByVal
hwnd As Long, lpPoint As POINTAPI) As Long
'用来确定当前鼠标的位置

Private Declare Function ClipCursor Lib
"user32" Alias "ClipCursor" (lpRect As Any)
As Long '用来限定当前鼠标的活动范围

---- 3.定义一个通用过程ConfineTo
Public Sub ConfineTo (myCtl As Object)
On Error Resume Next
Dim tmpRect As RECT
Dim pt As POINTAPI

With myCtl
If TypeOf myCtl Is Screen Then '锁定在屏幕范围内
tmpRect.Left = 0
tmpRect.Top = 0
tmpRect.Right = (.Width \ Screen.TwipsPerPixelX)
tmpRect.Bottom = (.Height \ Screen.TwipsPerPixelY)
Elseif TypeOf myCtl Is form '锁定在窗体范围内
tmpRect.Left = (.Left \ Screen.TwipsPerPixelX)
tmpRect.Top = (.Top \ Screen.TwipsPerPixelY)
tmpRect.Right = (.Left + .Width) \ Screen.TwipsPerPixelX
tmpRect.Bottom = (.Top + .Height) \ Screen.TwipsPerPixelY
else
pt.X = 0
pt.Y = 0
Call ClientToScreen(.hWnd, pt)
'获取当前控件在屏幕上的位置
tmpRect.Left = pt.X
'保存当前控件位置
tmpRect.Top = pt.Y
pt.X = .Width
pt.Y = .Height
Call ClientToScreen(.hWnd, pt)
tmpRect.Bottom = pt.Y
tmpRect.Right = pt.X
End If
Call ClipCursor(tmpRect)
End With
End Sub

---- 4.在 CMButton1_Click()中加入以下代码
Static Cliped As Boolean
'静态变量用来控制状态切换
If Not Cliped Then
ConfineTo Cmbutton1
Cliped = True
Else
ConfineTo Screen '取消鼠标限制
Cliped = True
End If

---- 5. 运行后,鼠标点击cmbutton1,此时鼠标只能被锁定在此按钮内部,再次点击按钮,限制取消。
二.创建临时文件
---- 临时文件用来保存软件运行过程中的临时变化,这对于熟悉WORD等软件的人来说,经常会遇到。那么临时文件是如何产生的呢,其实很简单,只需要一个API函数就可以。
---- 1.拷贝声明函数(方法同前)

Private Declare Function GetTempFileName Lib "kernel32" _
Alias "GetTempFileNameA" (ByVal lpszPath As String, _
ByVal lpPrefixString As String, ByVal wUnique As Long, _
ByVal lpTempFileName As String) As Long
参数定义如下:
lpszPath =传入保存临时文件的路径 ,如"C:\mytemp"
lpPrefixString=传入临时文件名开始的前三个字母,
起到帮助识别临时文件来源的作用。
wUnique =0 ,windows随机产生文件名;否则安其值定义文件名。
lpTempFileName=返回随机文件名

---- 2.返回临时文件名
Private Function GenTempName(sPath As String)
Dim sPrefix As String
Dim lUnique As Long
Dim sTempFileName As String

If IsEmpty(sPath) Then sPath = "c:\temp"
sPrefix = "TVB"
lUnique = 0 'windows随机给名

sTempFileName = Space$(100)
GetTempFileName sPath, sPrefix, lUnique, sTempFileName
sTempFileName = Mid$(sTempFileName, 1,
InStr(sTempFileName, Chr$(0)) - 1) '去掉多余空格
GenTempName = sTempFileName
End Function

---- 3.将下面代码加入到form1_click()事件中
MsgBox GenTempName("c:\temp")

---- 4.运行,鼠标点击form,弹出msgbox,显示生成"c:\temp\TVB724.tmp"文件,用文件管理器查看,在c:\temp下有TVB724.tmp 文件,长度为0K。
---- 需要注意的是,传入的路径必须是有效路径,否则GenTempName函数返回0,lpTempFileName中也没有临时文件名。

三.结束语
---- 从上面可以看出,API函数的确简单高效,但也充满一些看似高深的变量而使人却步。我们不禁会问,究竟什么时候要用到API函数?具体哪些函数可以解决我的问题?,那些函数中的变量都代表什么?其实对这些问题,即使对一个VB高手也难给出明确的回答,因为API函数库实在太庞大了,每一个人最终只能熟悉其中的一小部分(这也可能是调用API的文章层出不穷的原因吧)。总结自己的一点经验,我觉得应该注意以下几点。
---- 1.熟练掌握VB基本技巧,了解其所能所不能,这是最基本的要求。

---- 2.了解WINDOWS内部控制机理,这样对一些复杂的问题就可以逐步分析其调用机制,初步确定采用哪部分的API函数来解决问题。

---- 3.案头必备一本最新的VB版的WINDOWS API 大全,推荐机械工业出版社的<>。书中给出了每一个VB可以调用的API函数的详细说明,可以帮助精确了解所需要的API函数的变量声明。

---- 4.多看别人的程序。报纸杂志,尤其是网上这方面的文章数不清。这是最快的方法。

---- 5.随用随查。永远不要在用不到的函数上浪费宝贵的时间
Web动画图像分解在VB动画设计中的应用 播放 .flc 动画 -VB资料 播放 AVI -VB资料 播放MP3文件 -VB资料 播放背景音乐 -VB资料 播放声音文件 -VB资料 播放资源文件文件中的声音-VB资料 不用ActiveX控件也能播放声音文件-VB资料 VB创建动态图标 电影结束画面的卷动效果-VB资料 二进制操作截取VCD片断 -VB资料 非常VB测声卡 关闭屏幕保护功能,改变屏保等待时间 -VB资料 VB获取桌面窗口图象 红色警戒&amp;终级动员令-VB资料 检查是否安装声卡 -VB资料 将 .flc 动画档放在某一个 hWnd 之中播放 -VB资料 截取屏幕图像-VB资料 开机,自动更换墙纸 -VB资料 控制PC喇叭 -VB资料 利用VB测声卡 利用VB进行多媒体程序设计初步 利用Visual Basic设计多媒体应用程序 满屏播放AVI文件-VB资料 平铺贴图背景 -VB资料 破解WINDOWS屏幕保护密码 -VB资料 巧用VB编程使XMPLAYER自动播放VCD VB取得 WAV 文件信息 趣味撞球VB5应用程序一例 VB如何从&quot;SOUND.DRV&quot;中提取声音 VB如何设定墙纸的显示方式? PB做的客户端进销存软件的毕业论文,该怎么写,给点意见! 招聘网页美工人员和ASP程序员 [帮我顶]强烈建议CSDN论坛加入贴图功能!! 请问如何屏蔽其他窗口? filter 问题 ????????????? 国内哪个大学的计算机图形学最强? 如何用ACCESS建立一个合理的数据库? 需要空间的看看 如果主键和其他表的外键相连是不是没有办法删掉其中某些表的数据吗? 求助:xls用odbc不能编辑,出错:Syntax error or access violation PE格式的资料你有吗? VB 中的类模块与模块之间的联系是什么? 怎样从windows访问linux的ext3分区? 关于CFM-Resources免费空间(asp+cf+access+30M)的问题!100分 消息接收后拆分,毕设急!!60分已经是倾我所有了 热心的VC大虾,请多帮忙 请问如何用JAVASCRIPT获取服务器时间,并以字符串形式输入,如:200206021943,谢谢! ADO访问access数据库,怎样删除一条记录???? 关于字符串转日期型的值的问题 Tadoquery中参数返回的问题 请问各位高手门,现在公司的数据库编程普遍用哪种模式ADO或ODBC? 如何在CFormView中添加位图背景?? 谁来帮我看看这几行程序!我实在无法解决,谢谢! 请问如何自己编程使用Logitech QuickCam 人工智能的问题(乜人都要睇) 400分题目问题要解决了就立刻、马上、立即、给分! 菜鸟问题c++中清屏函数在哪? 请问哪里有c#语法的速查手册,最好有与vb的对照版? ISA声卡,CD与ME! 帮帮忙,一个很简单的sql语句 机器的电源关不了?(重谢!) 对话框算窗口吗? Delphiz中的Excel报表问题(十万火急!!!) help 请各位帮忙介绍一本linux的入门教材,多谢!! 菜鸟送分了!(报表打印问题) 学编程N个月了,我今天要学会HOOK到底是什么函数怎么用的,想吐血的先近来~~~~ 报告D6的一个BUG 要编写象boot.ini这样的 文件 我 应该学习什么 project工程文件????? 杭州的Delphi程序员,我在华星。留下QQ和Email吧。 求救一个语句 如何实现数据库的事务操作,对记录进行编辑?高分相送。 通信 ISP拨入电话,北京地区还有八位的吗? 毕业设计的朋友进来签到?(我做个统计) 如何引用上一级对话框 怎样获得主板BIOS版本\厂商号,版权? 中科院软件学院的项目经理硕士怎么样?听说师资力量很好 小问题:如何获得字段protect的值? 有可能在游戏中,例如星际,弹出对话框吗? 求pH计温度补偿具体操作方法室温在5℃左右,pH标准液温度也在5℃左右,现在要测一杯80℃的溶液的pH值,请问应该怎样调节酸度计上的温度补偿? .近年来由于土地沙漠化日渐加剧,沙尘暴频繁,严重影响国民生活,为了防止制沙,政府决定投入资金,鼓励鼓励农民植树种草.经过测算,植树1亩需资金200元,种草1亩需资金100元,某组农民计划在一 氕、氘、氚是同种原子吗rt 给见,垂,火加偏旁见()()()()()()垂()()()()()()火()()()()()() 为什么说沙尘暴频发与土地沙漠化的步伐是一致的? 氕氘氚 是否属于同种原子氕氘氚都是氢元素 是否属于同种原子 什么样的才算是同种原子 还有核素的概念怎么理解 举几个例子 一辆卡车从A城驶向B城,每小时行60千米,开出1.5小时后,一辆轿车从A城驶向B城,每小时行90千米,几小时后,轿车追上卡车?(用方程解)这是一题小学五年级的题. 活性炭纤维动态吸附来降cod,效果怎么样?如果用在处理反渗透浓水(cod100多)能达排放标准不?方法是否可 氕,氘,氚三种原子的_____数相同,互为______原子四楼:这课我们还没上 一辆汽车从A城开往B城,A每小时行驶60千米,9小时后能到达B城吗?比例尺1;5000000图上距离9厘米. 中国好声音导师评价声音好坏的标准 类原子 是指一种元素可能不止一种原子.它包括( )原子(如:氢元素有三种原子:氕、氘、氚)也包括( )(如:铁元素通常有三种存在形式,即Fe、Fe2+、Fe3+) 一辆卡车,从A城驶向B城,每小时行驶60千米 ,开出1.5小时候,一辆轿车从A城驶向B成城,每小时行驶90千米,几小时后轿车能追上卡车?(用方程解答) 英语翻译不知道读什么打出来字也行啊?1111你再通过其他方法试试郁闷了,咋会没呢? 应变片产生温度误差的原因及减小或补偿温度误差的方法是什么? 若河水结冰时能承受的最大压强5*10pa,一辆总质量为20t,每条履带与地面的接触面积为2.5m^2的拖拉机能否安全通过? 摺的偏旁改成火读什么 火车开车前为什么要放气? 火可以加什么偏旁 请问“经”字把左边的偏旁换成“火”字怎么读 有一列火车正在做匀加速直线运动.从某时刻开始计时,第1分钟内,发现火车前进了180m.第6分钟内发现火车前进了360m.则火车的加速度为求祥做! 火能加些什么偏旁? 恒偏旁改成火念什么? 10 克的氢氧化钠融入400毫升的溶液里,问摩尔密度是多少 火能加什么偏旁 中闭电磁阀为什么有两线圈中闭电磁阀与普通的区别,为什么有两线圈,两线圈的工作过程是怎样的那我要把气缸跑到磁簧位置停止,那两线圈的通电时间是同时还是?是不要占用PLC两个输出点呢 有一列火车正在做匀速直线运动,从某时刻开始计时,第一分钟内,发现火车前进了180,第六分钟内发现火车前进了360米,则火车的加速度是多少?对不起,是匀加速运动 电磁阀的线圈漆包线有烧毁的现象是什么原因?有冰箱上用的脉冲电磁阀,电磁阀的工作方式为脉冲驱动,脉冲的获取是通过50hz/60hz的交流信息整流后获取,只有4-8个脉冲,额定电压为220V.但出现的 电阻应变式为什么要进行温度补偿 滴定氢氧化钠最后结果为百分含量,在不知道密度的情况下怎样换成摩尔含量. 电磁阀线圈经常烧坏,求详解 请问进口水泵市场上什么水泵的销售量好,已知道,丹麦格兰富,德国威乐,希望有了解的人帮助, 这简单升压图如何控制电压. 电磁阀线圈烧坏,为什么要整体更换 格兰富静音增压泵家用的多少钱 求直流电压2.6V升压到5.0V的升压电路设计图RT最好变压器可以自制(带制作方法最好)本人都电子元件不大熟悉 尽量详细…… 电磁阀线圈烧坏,能修吗 威乐家用增压泵声音大怎么回事我家7楼,花了四百多买了个德国威乐增压泵,安装后声音很大,是怎么回事? 我有一个电池,已经对其进行升压,如何将其正电压转换成正负两个电压,最好有个图之类的, 铜怎样可以生成氯化铜?能不能直接生成氯化铜? 请问我家的情况该用哪种威乐的增压泵我家是复式结购二层楼的住房.家里水压很小没有冲力像流水一样.晚上楼上更是无法出水.我想在房间进水主管道那里安个威乐的水泵.请问该买哪种型号 我需要一幅把3V电压升压到5--9V的电路升压图,哪位高手请指教.要详细说明.电路图 氯化铜如何提取单体铜 氢氧化钠未知溶液20毫升,用0.1摩尔每升的标准溶液滴定消耗30毫升,求未知溶液的 水体的化学物质污染有哪几种? 臭氧的密度是多少?一般洁净区消毒臭氧熏蒸需要哪些注意事项? 如何从氯化铜溶液中制取铜(要进行两步操作的!) 美国电影中有一部跑车在火车轨道上跑的电影是什么.4个轮胎都没有了 带自动温度补偿功能的pH计,在进行样品的测量时,显示pH值是当前的温度下的示值,还是补偿到25度°C的pH值如果显示的是当前pH值,那温度补偿意义何在呢? 沙尘暴和土地沙漠化对我国的危害请尽快回答我! 为什么铁路员工在检查火车时,总是用一个小锤子敲打车轮? “火”加部首可以组成什么字 归纳沙尘暴和土地沙漠化产生并愈演愈烈的原因是什么? 有经验的铁路工作人员,在检查火车的车轮和支撑弹簧是不是正常时,常用锤子敲敲就会找出故障,这主要时根据声音的()来判断A 响度 B 音色 C 音调 D 是否悦耳 酸度计上有个温度补偿,它起什么作用?怎样使用? 为什么沙尘暴和土地沙漠化越演越烈 火车停站时,时常有铁路检查人员去检查车轮,他们用锤子敲是根据声音的什么?RTA.响度B音色C音调 火加偏旁变成什么字 养猪场的沼气为什么烧不燃 生锈的生铁片放在稀盐酸中产生了气体,用试管收集后移近火焰发出尖锐爆鸣声,这能说明生铁片含有什么?"试管收集后移近火焰发出尖锐爆鸣声"请仔细想想这个问题,这明显是氢气不纯
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘