VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 通过实例学习窗口函数---取得IE地址栏的地址
发表评论(0)作者:影子, 平台:VB6.0+Win98, 阅读:11533, 日期:2000-12-18
通过实例学习窗口函数---取得IE地址栏的地址
作者:影子
大家知道在 Windows 中,每个程序都是窗口的形式,不管是隐藏的还是显示的,都可以取得它们的句柄,而每一个程序中的控件又都是一个一个的子窗口,同样也可以取得它们的句柄,这样在理论坛上可以取得任意程序中任意位置的值,这里我们就以取得 IE 浏览器地址栏中的地址为例子,在下面的例子中我分别自定义的 3 个函数:
1、EnumProc `遍查主窗口
2、GetZiWin `遍查子窗口
3、GetWinText `取得指定句柄的值
这 3 个函数只要做一定的修改,就可以在你任意的程序中单独使用,最后希望大家通过这个例子能够掌握窗口函数的基础技巧。
程序界面:
如图1所示,装载 1 个 CommandButton(Caption 为 取得 IE 地址栏的地址)、1 个 ListBox 控件,其他属性全部为默认。
程序代码:
Form1.frm 文件
Option Explicit
Private Sub Command1_Click()
  List1.Clear
  EnumWindows AddressOf EnumProc, 0
  If List1.ListCount = 0 Then List1.AddItem "没有启动 IE 浏览器"
End Sub

Module1.bas 文件
Option Explicit
`相关 API 函数声明
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Any, ByVal lParam As Long) _
As Long ``枚举窗口列表中的所有父窗口(顶级和被所有窗口)
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, _
ByVal lpString As String, ByVal cch As Long) As Long `取得指定窗口的司法题
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal _
lpClassName As String, ByVal nMaxCount As Long) As Long `为指定的窗口取得类名
Public Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long `取得窗口句柄
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal _
wMsg As Long, ByVal wParam As Long, lParam As Any) As Long `发送消息

Const GW_CHILD = 5
Const GW_HWNDNEXT = 2
Const WM_GETTEXT = &HD
Const WM_GETTEXTLENGTH = &HE

`遍查主窗口
Public Function EnumProc(ByVal app_hwnd As Long, ByVal lParam As Long) As Boolean
Dim buf As String * 1024
Dim length As Long
Dim title As String

  length = GetWindowText(app_hwnd, buf, Len(buf))
  title = Left$(buf, length)

  `判断是否为 IE 浏览器窗口
  If InStr(title, " - Netscape") Or InStr(title, " - Microsoft Internet Explorer") Or InStr(title, "Offline Explorer") Then
    Call GetZiWin(app_hwnd)
  End If
  
  EnumProc = 1
End Function

`遍查子窗口
Public Function GetZiWin(window_hwnd As Long) As String
Dim buf As String
Dim buflen As Long
Dim child_hwnd As Long
Dim children() As Long
Dim num_children As Integer
Dim i As Integer
    
  buflen = 256
  buf = Space$(buflen - 1)
  buflen = GetClassName(window_hwnd, buf, buflen)
  buf = Left$(buf, buflen) `取得子窗口的类名
   
  If Right(buf, 4) = "Edit" Then `判断是否为地址栏子窗口
    GetZiWin = GetWinText(window_hwnd)
    Exit Function
  End If
    
  num_children = 0
  child_hwnd = GetWindow(window_hwnd, GW_CHILD) `取得第 1 个子窗口的句柄
  Do While child_hwnd <> 0 `如果有子窗口
    num_children = num_children + 1
    ReDim Preserve children(1 To num_children)
    children(num_children) = child_hwnd
    child_hwnd = GetWindow(child_hwnd, GW_HWNDNEXT) `取得下一个兄弟窗口的句柄
  Loop
    
  For i = 1 To num_children
    Call GetZiWin(children(i))
  Next i
End Function

Public Function GetWinText(window_hwnd As Long) As String `取得子窗口的值
Dim txtlen As Long
Dim txt As String

  `通过 SendMessage 发送 WM_GETTEXT 取得 IE 地址栏的值
  GetWinText = ""
  If window_hwnd = 0 Then Exit Function
    
  txtlen = SendMessage(window_hwnd, WM_GETTEXTLENGTH, 0, 0)
  If txtlen = 0 Then Exit Function
    
  txtlen = txtlen + 1
  txt = Space$(txtlen)
  txtlen = SendMessage(window_hwnd, WM_GETTEXT, txtlen, ByVal txt)
  GetWinText = Left$(txt, txtlen)
  
  Form1.List1.AddItem GetWinText
End Function

相信大家看了上面的代码应该知道取得"任意窗口值"的原理,本程序在 VB6.0、Windows 98 下运行良好。