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

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.随用随查。永远不要在用不到的函数上浪费宝贵的时间
盘点2014:最受关注的十大云服务创业公司 基于Kubernetes构建Docker集群管理详解 漫画:编程语言学习曲线 彩云天气: 328万元大奖背后的故事 iOS开发的22个奇谲巧技 谁是最受欢迎IT企业?技术、薪酬、发展空间、创新能力大评比 Jolt Awards 2015最佳编程工具奖榜单揭晓,Cloud9 IDE众望所归! 展望2015:数据中心行业的十大预测 亚信CTO金亚东:传统企业向产业互联网转型的两条路径 微信评论功能开启将成净土还是地狱 如何定位Android NDK开发中遇到的错误 流行从这里开始,MDCC 2014十大人气产品榜单揭晓! 专访POWER 8编程挑战赛选手唐刚:大数据计算永远是主角 微信公众号认证命名松绑,您怎么看? LambdaNet:纯Haskell实现的人工神经网络库 专注模式识别,易道博识为海量信息输入提供便捷之门 【问底】Michael G. Noll:整合Kafka到Spark Streaming——代码示例和挑战 2014年手游和社交游戏行业重要趋势解读 腾讯副总裁罗道锋:共建全国最大安全云库 5分钟内数据精准共享 Connected Cycle 一举两得的智能自行车踏板 CES可穿戴产品前瞻:汽车厂商入局智能手表领域 果断Mark!国外程序员收集整理的PHP资源大全 Google 2015项目前瞻:智能隐形眼镜、Google X、Ara Swift的坑:如何实现enum的多选? Swift,其实没那么任性 如何利用单台服务器实现10万多个Git仓库托管 Swift的初始化方法 TIOBE 2015年1月编程语言排行榜:JavaScript成大赢家 为什么iOS开发不需要Storyboard? 仅有纽扣大小的开发板 Intel Curie “撒娇”的豌豆荚?被百度手机助手屏蔽太糟心! 非常着急,各位高手一起来帮我研究一下这个工作流系统怎么用? 简单问题,肯定给分! 据说高程的通过标准是上下午加起来算了? 请斑竹帮忙 请问各位前辈: 在执行中出现"incorrect syntax near 'JCSZ'"的错误提示,如何解决? 下标越界是什么意思啊? 一个基础性的问题,同样一份C/C++源代码可以在UNIX 和WINDOWS运行需要具有的条件是啥??? 在一台计算机上安装两个键盘同时接受输入的问题 对XML文档中的数据能不能进行SELECE操作???? 如何用JAVA实现263邮件那样的邮件粘贴功能 请教各位大哥,小弟最近遇到麻烦,为什么我的程序安装时,出现expsrv.dll无法注册的提示?expsrv.dll有什么作用?怎样闭掉? 如何在两个结构相同的库之间倒数?? 请问如何简单确定右键点击的是哪个控件? 有哪位高手可以给出windows98登录时网络服务的身份验证模块的程序或相关资料的呢?非常感谢啦 在CTreeCtrl中同时使用系统图标与自定义图标的问题?? SHGetFileInfo()为什么在Win2000下工作不正常? 请问高手:DataGrid的问题 jsp和servlet是怎样交互的? 请问 有什么方法能实现 在几个数中随机取出几个数 谢谢 请问:在执行文件DPR中有一段代码出现错误,请各问指点! 两个问题:1 关于.NET中 一个新控件propertyGrid1的使用问题;2 我想生成一个由lable和TextBox合成的控件(label在左,TextBox靠其右),怎么办? 分栏打印 依旧是undefined function mysqsl_connect()问题 急:如何在生成的exe中添加新的属性页,显示更多文件信息? V-DVD ROM!? MSDN上的例子需要uafxcwd.lib,怎么找不到呢? 请问窗口的other事件是如何触发执行的 JSP如何学习 vc在什么时候会引起小喇叭的叫声 请教高手,如果在VB里实现内存共享? 用什么方法可以转换图片类型?譬如将BMP格式的转换为JPEG格式的,请各位大哥给点提示!!! 关于vb script数组和函数功能的二个问题!高难度! 关天打印问题? 只能最小化到屏幕的左下角 *急:无为,acptvb,请帮忙看看http://www.csdn.net/Expert/topic/426/426766.shtm (有关XMLHTTP) 在php中要取出一段字符串的前n个字节,而又要判断最后一个是中文还是英文,如果是中文则将最后半个字符省略应该怎么做? 有在BCB5中用过sapi5朗读中文的朋友,高分送上! 最初级的问题,关于编译程序的。 重庆市信息产业办公室荣获全国最差信息产业办公室称号 大家用PB创建Jaguar应用程序时,一般创建一个大包还是多个包阿? 奇怪的问题,来者有分!没回答问题的先到先得! 如何把临时表建在内存中 请教一个关于DELPHI多线程的问题 *急:无为,acptvb,请帮忙看看http://www.csdn.net/Expert/topic/426/426766.shtm(有关XMLHTTP) 比爱情少一点,比友情多一点,即不讨厌又不来电,你能做到吗? 请教一个问题,一个分两帧的窗口,分别是两个CView的子类。一个view里的下拉框选中一条记录,使另一个view刷新。不知道用什么mfc函数。 有关新开窗口的问题! please intrduce a good muti-root soft for win95,win98,winme,win2000,winxp 求助:哪位大侠能介绍一下网络传输设备(象 HDSL、Cable Modem)的品牌、厂家和性能? 我的ie浏览器怎么了? 搞软件开发时应不应该是一边看书一边搞开发? 用滑轮组匀速提升重为3000牛的物体,作用在绳子自由端的拉力为625牛,拉力做功的功率为1875瓦,滑轮组的机 在整数数位顺序表中,每两个计数单位间的进率是十.小学十年级数学题判断对错. 每相邻两个计数单位之间的进率是什么 某滑轮组匀速提升重为2000N的物体,作用在绳子自由端的拉力为625N,物体在20S内匀速上升5m滑轮组机械效率为80%,不计绳重和摩擦.1、绳子段数n2、总功功率3、若提升3000N的物体,滑轮组飞机械效率 从个位起,把整数的数位有顺序的排列出来 . 十位的计数单位是【 】,万位的计数单位是【】相邻两个计数单间的进率是【 】急啊啊啊啊啊! 一盏吊灯用绳挂在天花板上,天花板受到拉力的施力物体是天花板吊绳吊灯地球 用滑轮组匀速提起400牛重的物体,作用在绳子自由端的拉力需125牛,拉力做功的功率为250瓦,此时滑轮组的机求 动滑轮的重 如果用这个滑轮组匀速提升900牛重物 作用在绳子上的拉力为多少 机械 挂在天花板上的物体绳子对物体的拉力来自于本身还是地球就是和物体重力平衡的那个力各楼朋友们我是说绳子本身为何有拉力为什么QQ上的人说这个拉力是万有引力? 和吊灯重力平衡的力是;A吊灯对电线的拉力B电线对天花板的拉力C电线对吊灯的拉力D天花板对电线的拉力 用滑轮匀速提升重为2000牛的物体,作用在绳子自由端的拉力大小为625牛,拉力的功率为1250瓦,滑轮组的机械公式 一物体质量为M.用绳子挂在天花板上,当以六分之一的加速度竖直加速上升时,求绳对物体的拉力? 天花板上悬挂着一只吊灯.灯绳对灯的拉力和( )是一对平衡力;灯对灯绳的拉力和( )是一对相互作用力 高中物理需平衡摩擦力的实验有哪些 要全! 一物体用绳悬挂于天花板上处于静止它所受绳子拉力的反作用力作用在__上它所受绳子拉力的平衡力是___ 一书静止在桌面,书受到的支持力和桌子受到的压力是同时发生吗 高中物理力学实验哪些需要平衡摩擦力哪些不用?为什么? 高一物理:物体在传送带的摩擦力方向如何判断?用下两个图请具体讲解 每相邻的两个计数单位之间的进率都是10,这种计数方法叫做什么? 高中物理必修一二中哪些实验需平衡摩擦力? 【高一物理】平衡摩擦力是什么?怎么做?顺便求(3)详细过程为了验证“当质量一定时,物体的加速度与它所受的合外力成正比”.一组同学用图甲所示的装置进行实验,并将得到的实验数据 每两个相邻的计数单位之间的进率都是十,这种计数方法叫( ) 在牛顿第二定律的实验中,平衡摩擦力的作用是什么,为什么一定要平衡摩擦力,如果不,有什么影响呢,谢谢 一根绳子能承受的最大拉力是25牛,拉重700牛物体,1米每秒的速度,绳子刚好不断,若5米每秒,绳子会断吗?一根绳子能承受的最大拉力是25牛,拉重700牛的物体,以1米每秒的速度,绳子刚好不会断,若 每相邻两个计数单位之间的进率都是(),这个计数方法叫做(). 与亿相邻的计数单位是()() 与亿位相邻的数位是()位()位 与亿相邻的自然数是()和()快 一根绳子只能承受1200牛的拉力,如果用它提升浸没在水中10米深 一根绳子只能承受1200牛的拉力,如果一根绳子只能承受1200牛的拉力,如果用它提升浸没在水中10米深,重力为4500牛体积为20分米3的 什么是平衡摩擦力? 用滑轮组匀速提起400牛的中物体,作用在绳子自由端的拉力为125牛,拉力的功率为250瓦,此时滑轮组的机械效率为80%,不计摩擦和绳重求:(1)物体被匀速提升的速度这一小题答案究竟是多少? 绳子一端系在车上,另一端系在树上,绳长10米,用300牛的拉力把绳子中点向下拉0.5米绳子作用在车上力大A:3000牛B:6000牛C:300牛D:1500根3 验证牛顿第二定律改变小车质量后为什么不重新平衡摩擦力?改变小车质量后小车所售摩擦力会改变而此时为什么不重新平衡摩擦力? 重为G的物体被手抵在墙上,受墙的摩擦力是否为G?那难道不受手的摩擦力吗,那物体岂不不平衡? 用动滑轮提升重物,重物的质量是50千克,绳子自由端在300牛的拉力F作用下以0.2米/秒的速度沿竖直方向匀速上升,求拉力F的功率及动滑轮的机械效率 为什么在验证牛顿第二定律时只做一次平衡摩擦力? 假如没有摩擦力 数位就是计数单位这句话是错的.哪里错了?如果要这句话正确怎么改?错在什么地方? 牛顿第二定律 如何平衡摩擦力就是先把木板垫高,然后捏.就没了?就是说我怎么知道摩擦力已经平衡了?打点计时器?弹簧测力计? 如何区分“数位”和“计数单位” 在功与速度变化关系中,不平衡摩擦力,能否利用这个实验装置探究拉力与摩擦力的合力做的功速度变化的关系标准答案是:假如不平衡摩擦力,那么当拉力与摩擦力的合力为零时,小车的位置不 探究加速度与力,质量的关系的实验中,需要平衡摩擦力,平衡摩擦力时应该使小车1.挂上钩码,拖上纸带2.不挂钩码,拖上纸带3.不挂钩码,不拖纸带4.挂上钩码,不拖纸带 数位和计数单位的区别? 高中物理实验探究加速度与力和质量的关系时为什么要平衡摩擦力?重点说下目的,不平衡摩擦力会怎样. 实验探究加速度与力,质量的关系中:木板倾角过大是平衡摩擦力过大,还是平衡摩擦力不足还有平衡摩擦力过大过小的图像是什么, 在升降机的天花板上用轻弹簧悬挂一个小球,升降机静止时,弹簧伸长量为4cm,升降机运动时,弹簧伸长量为3cm,则升降机的运动情况可能是A.以a=1/4g的加速度加速下降B.以a=3/4g的加速度加速下降C. 假如没有了摩擦力鬼画符鬼画符鬼画符后 当做探究加速度与力.质量的关系平衡摩擦力时.斜面倾角偏大的a-f图像以a为纵坐标.以F为横坐标.图象是一条倾斜直线.但倾角偏大.所以不过坐标原点.而是在纵轴上有一段截矩这是为什么? 电梯的天花板上悬挂着一根弹簧,弹簧下端悬挂一重物,电梯向上做匀速直线运动,电梯停止后小球运动状况 选择题;把数字写在某一【】上,它才表示一定的数值.A记数单位,B位数C数位 在牛顿第二定律的实验中,如果平衡摩擦力过大或过小,则f与1/m的图像怎么画 数位和计数单位意义不同对吗 个十百千万······是( )a计数法b数位名称c计数单位( 用AC和BC吊起一重物,绳与竖直方向夹角分别为30度和60度,AC绳能承受的最大的拉力是150牛而BC能承受的最大的拉力是100牛,求物体最大重力不能超过多少? 绳端拉动一米,滑轮组内的物体上升几米?有公式吗 将物体用绳子吊在天花板上,绳所受物体的弹力方向是什么?是竖直向上,竖直向下还是指向绳子收缩方向?注意:是绳子受物体,不是物体受绳子… 绳AC,BC吊一重100N的物体,AC,BC与竖直方向夹角为30度与45度,求AC,AB对物体拉力 某人用25牛的力拉滑轮组的绳子移动4米,而总重为80牛的物体只升高1米,则滑轮组的机械效率为多少如果是对的,没有过程也行 将物体用绳吊在天花板上,绳受物体给的弹力方向是向上的怎么看弹力的方向就高手解答? 用两根绳吊起100牛的重物,两绳与竖直方向的夹角一个是60度一个是30度..求出每根绳子上的拉力 用滑轮组匀速提升重2000N的物体,作用在绳子自由端的拉力大小为625N,拉力做功为12500J,滑轮组的机械效率为80%,不计轮与转轴之间的摩擦和绳重.(1)求物体上升的高度;(2)如果使用这个滑 弹力的方向从施力物体指向受力物体,比如天花板上吊个物体对绳子的拉力就不否和这种说法 悬挂在天花板下重60N的小球,在均匀水平风力作用下偏离竖直方向30度角,求风对小球的作用力和绳子的拉力
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn