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

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.随用随查。永远不要在用不到的函数上浪费宝贵的时间
用VB制作屏幕保护程序 VB多媒体程序设计 VB设计动画时钟 VB游戏写作技巧(1)秀图篇 VB游戏写作技巧(2)网络篇 VB中播放WAV文件 VB中播放三维动画编程一例 Visual Basic 5.0多媒体创作技巧 Visual Basic 5.0中实现视频画中画 Visual Basic 中制作流水灯 Visual Basic动画编程技术 Visual Basic环境下Video/ Audio压缩数据流播放技术 Visual Basic设计多媒体应用程序 Visual Basic影音控制 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资料 怎么画不出图来? 如何定一个文件类型的变量? 水晶报表,多列(分栏)打印 如何使安装程序汉化?我使用的是installshield6.2 谢谢! datagrid中的问题:删除datagrid中某行时出现的问题。 使得窗口总是处于最前的函数是什么,谢谢 请教:如何用Sql实现查询本周发的帖子?? 如何用程序设置ie的页面设置中的页眉,页脚,边距和方向? 为什么要学Java http://Scjp.myrice.com 也许你的一切会改变! 请问怎么修改InstallShield中的可选项,如Typical、Compact、Custom等。 如何.定制通用对话框中的路径及文件名? 我照着网站上的中文输入法提示,做了可没效果 为什么要学Java 看 http://Scjp.myrice.com 也许你的一切会改变! 回答问题,我给500分!! 语音聊天用什么软件好?qq,netmeeting,yahoo message or icq? 为什么不能汇编成功? 各位,帮我一下,非赏急! 数据库快照复制问题,总出错,求救!(50分) 请问这是怎么一回事。win2k(p)+tomcat+jdk1.4.` 在VB中怎样设置Excel单元格的样式?如设置为百分数显示单元格数值? 下拉菜单问题? 请问这是怎么一回事。win2k(p)+tomcat+jdk1.4.` 求救,我财务系统的问题,大大们一定要帮助我呀! 我在调试jsp是的一个错误信息,请指教~~~ 急!!! 一个烦人的问题 关于在应用程序中使用dll中资源的问题 關於並行執行的問題 也许你现在就会改变!! 看 http://Scjp.myrice.com 为什么要学Java 其实我们很封闭! 关于NT的小问题! 请问: 請問哪里有c++的書籍下載? 几个控件重叠在一起,怎样用代码的方式使其中的某个控件在运行时放至最上!?谢! 也许你现在就会改变!! 看 http://Scjp.myrice.com 其实我们很封闭! 如何发布我的网站? 怎样编程在Windows开始菜单的的“启动”栏中添加本程序的快捷方式? 谁有installshield 6.30的license注册文件? 请问:DataGrid在WebForm中明明有数据显示,但用浏览器看就没,为何? 显卡选择问题 ? 也许你现在就会改变!! 看http://Scjp.myrice.com 其实我们很封闭! 一个Acme .....???? 共计350分哟。急急。。。。我在PHP区有发言。但是还连不上SQL SERVER2000呀。。请进 boyqing(阿清):我的问题转到这了! 谁有installshield 6.30的license注册文件? 高手请进! 大家用java都来做什么????? 搞linux,unix底层的在中关村有没有搞头? 请问为什么我的CBuilder中在菜单项File/new下的无法找到RemoteDataModule?我是新手,请帮忙! 这几句TSQL有错?帮忙看看 请教关于网卡与声卡冲突的处理方法 谁有installshield 6.30的license注册文件? 什么和什么的器官使昆虫不依靠水的浮力也能支撑身体和运动的器官 幼虫和若虫有什么区别 蝗虫的若虫育成虫相比,本质的区别是什么? 昆虫的内脏器官的相互联系呼吸系统和循环系统的关系 (紧急)生物中昆虫的"若虫"与"幼虫"的区别? 蝗虫的幼虫叫______(又叫若虫) 昆虫的器官有哪些组成 手足 这个词语 意思意思! 每当看到兄弟相争,手足相残,我们会很自然的想起曹植的《七步诗》中的诗句 请问这个是什么昆虫的幼虫求鉴定 照样子,写词语.眉目 手足 _______ ______ ______照样子,写词语.眉目 手足 _______ _____________ 三国时期曹植的《七步诗》中表达手足相残无比痛心的"_____,_____". 六年级上册语文21课老人与海鸥 老人为海鸥做了些什么? 灯泡为什么能吸引昆虫 求形容心痛的句子RT要句子,最好经典一些的,用于QQ个性签名里的 用一个杯子向空水壶倒水,如果倒3杯水,连壶重740克:如果倒进5杯水,连壶重980克,每杯水重多少克 不同颜色的灯对昆虫的吸引有何不同?我想在鱼塘水面上点几盏灯,来吸引昆虫,鱼能够吃到水面上的昆虫.请问用什么颜色的灯效果好一些.(对蚜虫没意义) 四年级下册语文书19课挣扎是什么意思 用一个杯子向空水壶里倒水,如果倒进三杯水,连壶重740克.如果倒进五杯水,连壶重980克.问每杯水重多少克? 所有昆虫的幼虫都经过5次蜕皮吗? 关于极坐标参数方程的问题(详细点) 用一个杯子向空水壶里倒水如果倒进三杯水加壶重740可如果倒进五杯水连壶重980,每杯水多少克 为什么灯亮吸引虫子 写动物的说明文【500字】 甲乙两杯分别有水20克,25克,甲杯放入3克糖,乙杯放入4克糖,哪杯水甜,为什么,请用多种方法比较 为什么昆虫会蜕皮? 写小动物说明文 400_500字 小学六年级上册语文第21课中的老人为什么要喂海鸥? 吸引虫子的灯叫什么等啊? 说明文500字动物青蛙 什么是无线电波,微波,红外线,可见光,紫外线,X射光,Y射线 蝴蝶的一生经历了卵--幼虫--蛹--成虫的形态,所以属于完全变态昆虫吗? 写一篇关于动物的500说明文不要想一楼说的一样,废话少说! 在可见光、无线电波、γ射线、伦琴射线、紫外线和红外线中,最容易发生衍射的是?粒子性最明显的是?热效应最明显的是? 昆虫蜕皮如果蝴蝶的二龄幼虫初期,脑分泌的能活化前胸腺的激素受到抑制,将使幼虫不再蜕皮这句话是正确的么? 表达兄弟之情语句兄弟由如是同一条船上的人!谁到了!另一个他也会牵着她一起经历… 无线电波,可见光,红外线,伦琴射线,紫外线的按发生明显衍射现象从易到难该如何排练 为啥有的荧光物质在晚上能发出 有的在紫外线下才能发出? 生活在人肠道内的寄生虫和微生物是一个群落吗? 用一个杯子向一个空水瓶倒水,如果倒进4杯水,连瓶共重520克 紫外线也能使荧光物质怎样? 描写兄弟之间的 词语褒义贬义都要 如何区分幼虫和若虫 月球表面有转化紫外线为可见光的荧光物质吗? 描写兄弟感情的古诗5首 不完全变态幼虫叫做若虫(水生是稚虫),那么若虫什么时候被成为蝻有时候若虫被称为蝻,如蝗虫.那么什么样的若虫被称为蝻? 表达手足相残无比痛心的诗句我好急用啊! 求动物说明文,600字 这是什么昆虫的幼虫? 《七步诗》中用“箕豆同根相煎”比喻“兄弟手足相残”,请再写一句使用比喻表意的诗句 紫外线是德国物理学家在1801年发现的,紫外线有很强的荧光效应,能使许多物质发出是高效速练33页第4题 这是什么虫子的幼虫 关于表示对手足相残无比痛心的诗句有哪些? 蝗虫的幼虫与成虫的主要区别 昆虫胸部有什么和什么运动器官 我们谈到手足相残时,我们用曹植的诗句 捕杀蝗虫的最好时候 若虫 还是成虫 或是别的 节肢动物的运动器官是什么?昆虫呢?鸟的运动器官包括足吗?哺乳动物呢? 幼虫与若虫的区别 蝗虫的幼虫和成虫的外部形态有何异同
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘