rt

解决方案 »

  1.   

    这是一个例子,不过是vb的,你看明白原理就可以读取IE地址栏信息  大家知道在 Windows 中,每个程序都是窗口的形式,不管是隐藏的还是显示的,都可以取得它们的句柄,而每一个程序中的控件又都是一个一个的子窗口,同样也可以取得它们的句柄,这样在理论坛上可以取得任意程序中任意位置的值,这里我们就以取得 IE 浏览器地址栏中的地址为例子,在下面的例子中我分别自定义的 3 个函数:  1、EnumProc `遍查主窗口
      2、GetZiWin `遍查子窗口
      3、GetWinText `取得指定句柄的值  这 3 个函数只要做一定的修改,就可以在你任意的程序中单独使用,最后希望大家通过这个例子能够掌握窗口函数的基础技巧。  程序界面:  装载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
      

  2.   

    非常感谢你,我也实现了,但是我觉得你的代码远比我严格得多,我实现方法很简单,直接挂了个shell钩子,然后对当前激活的窗口名进行检查,是否包含http://然后再返回去查该窗口的可执行文件,我做的这种方法很危险,很容易抓错,呵呵,听人说有一种什么shell下的编程可以非常容易的通过com对象来获得,我没有查到资料,不知道你知道么?如果知道的话请回一下,不知道我就结帖子了.