在WINDOWS中,如何读取其它应用程序窗口中的数据?

goodnow 2003-11-24 11:47:29
例如:在VB中如何读取浏览器中菜单和页面的文字内容;

如何读取防火墙管理软件界面上各个控件所显示的文字信息。

谢谢!
...全文
1257 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodnow 2003-12-01
  • 打赏
  • 举报
回复
谢谢 goodname008(卢培培,LPP Software)!!
goodnow 2003-11-29
  • 打赏
  • 举报
回复
TO: goodname008(卢培培,LPP Software)
谢谢,已经能把文本框里的内容读出来了。
另外,还有两个问题想再次请教:
1、比如浏览器中页面的内容和菜单如何读取?还有List中的内容如何读取?
2、我现在是用
Handle = WindowFromPoint(Pt.X, Pt.Y)
SendMessage Handle, WM_GETTEXT, 256, ByVal wndText
来直接获得需要地方的句柄和内容,但是如果程序自动运行时,不可能是通过鼠标来指取,你如何得到类名以及它们之间的父子关系呢?
goodname008 2003-11-29
  • 打赏
  • 举报
回复
2、得到窗口的父子关系,就是用到我说的窗口间谍了。
用鼠标找到窗口后,单击“隐藏窗口”将其隐藏,然后再把鼠标拖到刚才的位置就可以找到它的父窗口(其实找到某个窗口的同时,已经找到父窗口了),再单击“隐藏窗口”......
如果下去,直到找到顶级窗口(该窗口的父窗口句柄为0),就OK了。
像包圆白菜一样。 :)
goodname008 2003-11-29
  • 打赏
  • 举报
回复
(续上)
对于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 = &H189

Private 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 Sub

Private 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

goodname008 2003-11-29
  • 打赏
  • 举报
回复
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能做出各种风格的菜单来。 :)
bluemirror 2003-11-28
  • 打赏
  • 举报
回复
up
feilong215 2003-11-28
  • 打赏
  • 举报
回复
up
goodname008 2003-11-28
  • 打赏
  • 举报
回复
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 = &HD

Private 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

goodnow 2003-11-27
  • 打赏
  • 举报
回复
GetWindowText 无法从另一个应用程序的编辑控件中获取文字;比如Text控件,信息更改后,在本应用程序中就能读出更改后的信息,但是在另一个应用程序中就无法读出更改后的信息。而且Label控件也无法获得句柄。

如何才能解决这个问题?
mingtian2008 2003-11-27
  • 打赏
  • 举报
回复
up
goodnow 2003-11-27
  • 打赏
  • 举报
回复
没试出来
imur 2003-11-26
  • 打赏
  • 举报
回复
我也碰到一个问题。简单说就是:
我们这里有个软件,是C/S结构,我们这边是C端,客户那边是S端。通过通过我们这边的C端可以查询客户数据。但这些数据分两层显示,如:编号、姓名、地址、消费额等等为第一层,身份证号码、工作单位等为第二层数据。这些第一、第二层数据都可以通过我们这边的C端查询,但有个限制:只有人工输入“编号”查询出来第一层数据,再点击一个“详细资料”才能看到第二层数据。
请问:怎么才能写个软件,根据“编号”自动去读取第一、第二层第数据?
大侠们给个思路啊,困惑很久了。
谢谢先!
goodnow 2003-11-26
  • 打赏
  • 举报
回复
要调用哪个API,如何调用及获得信息?
Ranma_True 2003-11-26
  • 打赏
  • 举报
回复
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
应该可以吧


hjj223 2003-11-26
  • 打赏
  • 举报
回复
用api是最好的方法
goodnow 2003-11-26
  • 打赏
  • 举报
回复
我的情况和imur还不一样。

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

请各位大侠详细指点,谢谢!
goodname008 2003-11-25
  • 打赏
  • 举报
回复
http://www.800down.com/get.asp?id=1412&type=0&url=1

下载一个窗口间谍(中文),可以简单的获得代码。
或者用spy++,找句柄,知道类名后再在程序中用FindWindow和FindWindowEX找。
goodnow 2003-11-25
  • 打赏
  • 举报
回复
那该如何读取应用软件界面上各控件所显示的文字信息呢?

最好能有程序,谢谢!
xzp1030 2003-11-25
  • 打赏
  • 举报
回复
楼上的方法不行,up
simanh 2003-11-25
  • 打赏
  • 举报
回复
要调用API
加载更多回复(2)

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧