例如:在VB中如何读取浏览器中菜单和页面的文字内容;      如何读取防火墙管理软件界面上各个控件所显示的文字信息。谢谢!

解决方案 »

  1.   

    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 GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
      

  2.   

    http://www.800down.com/get.asp?id=1412&type=0&url=1下载一个窗口间谍(中文),可以简单的获得代码。
    或者用spy++,找句柄,知道类名后再在程序中用FindWindow和FindWindowEX找。
      

  3.   

    要调用哪个API,如何调用及获得信息?
      

  4.   

    我也碰到一个问题。简单说就是:
        我们这里有个软件,是C/S结构,我们这边是C端,客户那边是S端。通过通过我们这边的C端可以查询客户数据。但这些数据分两层显示,如:编号、姓名、地址、消费额等等为第一层,身份证号码、工作单位等为第二层数据。这些第一、第二层数据都可以通过我们这边的C端查询,但有个限制:只有人工输入“编号”查询出来第一层数据,再点击一个“详细资料”才能看到第二层数据。
        请问:怎么才能写个软件,根据“编号”自动去读取第一、第二层第数据?
        大侠们给个思路啊,困惑很久了。
        谢谢先!
      

  5.   

    我的情况和imur还不一样。就拿银行的业务来举例吧:客户来存1000元钱,业务员在执行存入操作的过程中,在当前窗口会显示客户的姓名,存入多少钱,我现在就是需要把客户的姓名和存多少钱等部分信息通过一个液晶设备显示给外面的客户看。
    因为我不可能去读取数据库,也不可能更改整个银行的业务系统,所以只能是从该业务系统显示结果的窗口中去读取数据,该如何做?请各位大侠详细指点,谢谢!
      

  6.   

    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 GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
    Private Declare Function WindowFromPoint Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
    应该可以吧
      

  7.   

    GetWindowText 无法从另一个应用程序的编辑控件中获取文字;比如Text控件,信息更改后,在本应用程序中就能读出更改后的信息,但是在另一个应用程序中就无法读出更改后的信息。而且Label控件也无法获得句柄。如何才能解决这个问题?
      

  8.   

    Label是轻量级控件,当然无法获得句柄。' 找到程序的窗口句柄后,发个消息
    ' 这个贴子的IE窗口别关,把代码复制到窗体代码中单击Command1就能获得地址栏中的URL。Option Explicit
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    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 Const WM_GETTEXT = &HDPrivate Sub Command1_Click()
    Dim Handle As Long
    Dim wndText As String
    wndText = Space(255)
    Handle = FindWindow("IEFrame", "在WINDOWS中,如何读取其它应用程序窗口中的数据? - Microsoft Internet Explorer")
    Handle = FindWindowEx(Handle, 0&, "WorkerW", vbNullString)
    Handle = FindWindowEx(Handle, 0&, "ReBarWindow32", vbNullString)
    Handle = FindWindowEx(Handle, 0&, "ComboBoxEx32", vbNullString)
    Handle = FindWindowEx(Handle, 0&, "ComboBox", vbNullString)  ' 获得窗口句柄
    Handle = FindWindowEx(Handle, 0&, "Edit", vbNullString)
    SendMessage Handle, WM_GETTEXT, 256, ByVal wndText
    wndText = Left(wndText, InStr(wndText, Chr(0)))
    Debug.Print wndText
    End Sub
      

  9.   

    TO:  goodname008(卢培培,LPP Software)
      谢谢,已经能把文本框里的内容读出来了。
    另外,还有两个问题想再次请教:
    1、比如浏览器中页面的内容和菜单如何读取?还有List中的内容如何读取?
    2、我现在是用
    Handle = WindowFromPoint(Pt.X, Pt.Y)
    SendMessage Handle, WM_GETTEXT, 256, ByVal wndText
    来直接获得需要地方的句柄和内容,但是如果程序自动运行时,不可能是通过鼠标来指取,你如何得到类名以及它们之间的父子关系呢?
      

  10.   

    1、API中有一套关于菜单的函数:AppendMenu 在指定的菜单里添加一个菜单项 
    CheckMenuItem 复选或撤消复选指定的菜单条目 
    CheckMenuRadioItem 指定一个菜单条目被复选成“单选”项目 
    CreateMenu 创建新菜单 
    CreatePopupMenu 创建一个空的弹出式菜单 
    DeleteMenu 删除指定的菜单条目 
    DestroyMenu 删除指定的菜单 
    DrawMenuBar 为指定的窗口重画菜单 
    EnableMenuItem 允许或禁止指定的菜单条目 
    GetMenu 取得窗口中一个菜单的句柄 
    GetMenuCheckMarkDimensions 返回一个菜单复选符的大小 
    GetMenuContextHelpId 取得一个菜单的帮助场景ID 
    GetMenuDefaultItem 判断菜单中的哪个条目是默认条目 
    GetMenuItemCount 返回菜单中条目(菜单项)的数量 
    GetMenuItemID 返回位于菜单中指定位置处的条目的菜单ID 
    GetMenuItemInfo 取得(接收)与一个菜单条目有关的特定信息 
    GetMenuItemRect 在一个矩形中装载指定菜单条目的屏幕坐标信息 
    GetMenuState 取得与指定菜单条目状态有关的信息 
    GetMenuString 取得指定菜单条目的字串 
    GetSubMenu 取得一个弹出式菜单的句柄,它位于菜单中指定的位置 
    GetSystemMenu 取得指定窗口的系统菜单的句柄 
    HiliteMenuItem 控制顶级菜单条目的加亮显示状态 
    InsertMenu 在菜单的指定位置处插入一个菜单条目,并根据需要将其他条目向下移动 
    InsertMenuItem 插入一个新菜单条目 
    IsMenu 判断指定的句柄是否为一个菜单的句柄 
    LoadMenu 从指定的模块或应用程序实例中载入一个菜单 
    LoadMenuIndirect 载入一个菜单 
    MenuItemFromPoint 判断哪个菜单条目包含了屏幕上一个指定的点 
    ModifyMenu 改变菜单条目 
    RemoveMenu 删除指定的菜单条目 
    SetMenu 设置窗口菜单 
    SetMenuContextHelpId 设置一个菜单的帮助场景ID 
    SetMenuDefaultItem 将一个菜单条目设为默认条目 
    SetMenuItemBitmaps 设置一幅特定位图,令其在指定的菜单条目中使用,代替标准的复选符号(√) 
    SetMenuItemInfo 为一个菜单条目设置指定的信息 
    TrackPopupMenu 在屏幕的任意地方显示一个弹出式菜单 
    TrackPopupMenuEx 与TrackPopupMenu相似,只是它提供了额外的功能 更具体的说明可以参考MSDN或者网上的中文说明,上面这些关于菜单的API足以满足你的要求了,其实用好这些API能做出各种风格的菜单来。  :)
      

  11.   

    (续上)
    对于List,我帮你写了例子,也是通过API发消息获得其内容的。Option Explicit
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Const LB_GETCOUNT = &H18B
    Private Const LB_GETTEXT = &H189Private Sub Command1_Click()
        Dim item() As String, i As Long
        GetListItem List1.hwnd, item()
        For i = 0 To UBound(item)
            Debug.Print item(i)
        Next i
    End SubPrivate Sub Form_Load()
        List1.AddItem "apple"
        List1.AddItem "orange"
        List1.AddItem "grape"
        List1.AddItem "banana"
    End Sub' 获得列表框中的内容
    Sub GetListItem(ByVal hwnd As Long, ByRef item() As String)
        Dim count As Long, idx As Long, i As Long
        count = SendMessage(hwnd, LB_GETCOUNT, ByVal 0, ByVal 0)
        For i = 0 To count - 1
            ReDim Preserve item(i)
            item(i) = String(255, Chr(0))
            SendMessage hwnd, LB_GETTEXT, ByVal i, ByVal item(i)
            item(i) = Left(item(i), InStr(item(i), Chr(0)) - 1)
        Next i
    End Sub
      

  12.   

    谢谢 goodname008(卢培培,LPP Software)!!