VB-API初级入门 (4)2009-09-12 10:48:27 www.hackbase.com 来源:CSDN博客
一、API是什么? 这个我本来不想说的,不过也许你知道其它人不知道,这里为了照顾一下新手,不得不说些废话,请大家谅解。 Win32 API即为Microsoft 32位平台的应用程序编程接口(Application Pr ...
API是需要和其它API一起进行工作的,首先让我们先看看CreateRoundRectRgn这个API。分析如下:
整体的意思是:创建圆角矩形。这里提示大家一个技巧,一般API中包函Rgn字符的都是代表可以改变对象外观的。可以看看我们使用的两个API,一个是SetWindowRgn(Rgn),一个是CreateRoundRectRgn(Rgn),希望你能明白其中的共同点。
参数:x1,y1,x2,y2,x3,y3这些都是坐标值,具体说明见以下:
X1,Y1 ---------- Long,矩形左上角的X,Y坐标
X2,Y2 ---------- Long,矩形右下角的X,Y坐标
X3 ------------- Long,圆角椭圆的宽。其范围从0(没有圆角)到矩形宽(全圆)
Y3 ------------- Long,圆角椭圆的高。其范围从0(没有圆角)到矩形高(全圆)
所以上面的代码具体是先通过CreateRoundRectRgn创建一个圆角矩形对象,然后通过SetWindowRgn来改变窗口的外观。
小提示:使用CreateRoundRectRgn可以创建圆角矩形,也可以使用CreateEllipticRgn创建椭圆形,CreatePolyPolygonRgn创建多边形,CreateRectRgn矩形等,细心观察它们最后三个字符 Rgn 呵呵,明白了吧。
3,获取其它窗口的句柄
这个我本来打算不讲的,不过网友们既然提出来了,我也只好详细说说。一般获取其它窗口的句柄使用以下API:
FindWindow,FindWindowEx,WindowFromPoint
这两个API就足矣,先看看第一个API的原型:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
里面一共有两个参数,先看第一个:ByVal lpClassName As String,字符串变量,所以这里需要传入字符串,第二个ByVal lpWindowName As String,同样一个字符串变量,这里也需要传入字符串。再看这个API为Function,有返回值的,那返回值就是我们需要的句柄了。好了,现在了解了两个参数的具体传递类型,那我们现在就要知道这两个参数中到底应该传入哪些值?如下:
ByVal lpClassName As String,lpClassName:类名。指窗口类名,如果忽略则传入vbNullString。
ByVal lpWindowName As String,lpWindowName:窗口名称。指窗口文本,如果忽略则传入vbNullString。
现在明白了两个参数需要传入哪些值就好办了,一个窗口的类名咱们有可能不知道,但是一个窗口的名称就好办了。如:咱们打开记事本程序,可以看到窗口标题显示为“无标题-记事本”。好了这就是咱们需要的,现在咱们就要通过这个窗口标题来获取记事本的句柄。新建一个标准EXE,然后输入以下代码:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Sub Form_Load()
Dim WindowHandle As Long
WindowHandle = FindWindow(vbNullString, "无标题 - 记事本")
MsgBox WindowHandle
End Sub
好了,F5运行,显示MsgBox消息框,如果不为0,那么咱们就获取成功了,如果为0,那么表示获取失败,这个时候你有必要检查一下你所要获取的窗口文本是否符合你所要获取的那个窗口文本(呵,这句话还真长!)。具体代码意思我就不讲了,大家可以自己分析下。
小提示:这个时候咱们已经得到句柄了,具体得到这个句柄干什么?那就看你了。给个例子,如下:
SetWindowText WindowHandle, "哈哈"
看看把这个代码放在上面代码中试下,呵呵!注意,SetWindowText你要先声明这个API。别忘了。
再看第二个FindWindowEx,这个API是在窗口列表中寻找与指定条件相符的第一个子窗口,原型如下:
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
看里面的参数,第一个和第二个:ByVal hWnd1 As Long,ByVal hWnd2 As Long,这里都需要传入句柄,再看第三个和第四个:ByVal lpsz1 As String, ByVal lpsz2 As String,这里所要传入的是字符串。具体意思如下:
hWnd1 ---------- Long,在其中查找子的父窗口。如设为零,表示使用桌面窗口(通常说的顶级窗口都被认为是桌面的子窗口,所以也会对它们进行查找)
hWnd2 ---------- Long,从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
lpsz1 ---------- String,欲搜索的类名。零表示忽略,注意一般传入vbNullString
lpsz2 ---------- String,欲搜索的类名。零表示忽略,注意一般传入vbNullString
用实践帮我们分析,这里还是拿记事本开刀。打开一个记事本,新建一个标准EXE,接着新建一个CommandButton,Caption设置为:设置文本。OK,写入以下代码:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
Private Sub Command1_Click()
Dim WindowHandle As Long, ChildWindowHandle As Long
WindowHandle = FindWindow(vbNullString, "无标题 - 记事本")
If WindowHandle Then '如果获取句柄成功
ChildWindowHandle = FindWindowEx(WindowHandle, 0, "Edit", vbNullString)
If ChildWindowHandle Then '如果成功获取子句柄
EnableWindow ChildWindowHandle, False '禁用子窗口
Else
MsgBox "无法获取子窗口"
End If
End If
End Sub
好了,帮大家分析。看第一行:Dim WindowHandle As Long, ChildWindowHandle As Long,用于储存获取的句柄的。WindowHandle = FindWindow(vbNullString, "无标题 - 记事本")这个就不用讲了,上面已经讲过。
ChildWindowHandle = FindWindowEx(WindowHandle, 0, "Edit", vbNullString),这一段是通过我们已经获取的记事本句柄获取其中的子窗口句柄。大家可以用Spy++查看到记事本的TextBox类,然后根据类名写入即可。
EnableWindow ChildWindowHandle, False 这又是一个新的API,虽然前面我没有前过,但是这个API使用起来及其简单。这个API中有两个参数,第一个理所当然是传入窗口句柄,第二个为Long变量,其实这里应该设为Boolean变量好些,主要是用来处理当前窗口是否可用。True可用,False禁用。
现在F5运行,记得打开记事本哦,然后点击Command1,看看能不能在记事本的文本框中输入字符串?是否被禁用了?
小提示:EnableWindow之所有讲出来,是希望提高大家使用API的兴趣,有些被禁用的窗口你可以使用这个API把它激活,至于怎么使用就看你自己了,这里给大家布置一个作业,呵呵,自己去完成吧。
最后一个API,WindowFromPoint,这个API主要是获取当前坐标的窗口句柄,不是有人想知道当前鼠标指针位置的窗口句柄吗?用这个是不错的选择,原型如下:
Private Declare Function WindowFromPoint Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
两个参数,一个是xPoint(x坐标值),一个是yPoint(y坐标值),现在你可以在这个两个参数分别传入其它窗口的坐标值就可以获取其它窗口的句柄了。可以看到为Function声明,返回值就是咱们需要的句柄。
咱们想实现的功能是获取当前鼠标指针位置的句柄,所以这里当然需要用到GetCursorPos了,结合前面所讲的,新建一个标准EXE,添加一个Timer控件,Interval设置为100,Enabled=True,OK,写如以下代码:
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Sub Timer1_Timer()
Dim lpPoint As POINTAPI
Dim WindowHandle As Long
GetCursorPos lpPoint '获取当前鼠标指针坐标
WindowHandle = WindowFromPoint(lpPoint.x, lpPoint.y)
Me.Caption = "当前鼠标指针位置句柄:" & WindowHandle
End Sub
好了,最后一次给大家分析了,至于GetCursorPos的使用与说明前面已经讲过,这里不再分析。看看WindowHandle = WindowFromPoint(lpPoint.x, lpPoint.y)这句,它是通过GetCursorPos获取的鼠标坐标值获取当前鼠标坐标位置的句柄。最后一句我就不用说了,在程序窗口显示获取的句柄。
好了,API入门已经告一段落,其实我还想写下去,不过似乎看的人多,响应的人少,很是打击我写下去的心情。不过还是希望大家能从上面学到一些知识。具体的API应用我就不多说,大家可以自己慢慢体会。如果你把以上我讲的全部都搞懂的话,那么证明你已经基本了解API的使用方法了,那下面就靠你自己了。至此,我希望我带了一个好头帮助你了解API。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hexinchun148/archive/2007/08/08/1731588.aspx
本篇文章来源于 黑客基地-全球最大的中文黑客站 原文链接:http://www.hackbase.com/tech/2009-09-12/55967_4.html