VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > vb >
  • 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: emp" 
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: emp") 

---- 4.运行,鼠标点击form,弹出msgbox,显示生成"c: empTVB724.tmp"文件,用文件管理器查看,在c: emp下有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.随用随查。永远不要在用不到的函数上浪费宝贵的时间

相关教程