其他窗口中的控件名称



我需要从其他窗口读取一个文本值,并将该值查询到另一个应用程序(我的问题将围绕第一个任务)…所以,我正在"监视"其他窗口(我们在产品中使用的某些第三方应用程序),并等待单击"接受"按钮从文本框中读取值。另一个应用程序对话框有多个文本框和命令按钮。我制作了一个鼠标挂钩,并在这个应用程序出现时激活它。我正在读取此窗口矩形内的所有鼠标移动;文本、标题、子窗口ID、矩形、左/右/中/滚轮点击。我可以点击"接受"按钮;我可以看到按钮标题,我可以阅读窗口,获取文本并确定点击了什么按钮,等等。现在…我可以读取所有EDIT类的值,获取它们的窗口句柄、矩形等,但我不能将它们识别为类集合中的唯一项:我需要专门读取我想要的文本框值。幸运的是,当我阅读EDIT类循环中的文本时,我感兴趣的文本框总是出现在循环的第一位。不过,我想更具体一点;确保我正在阅读带有NAME的文本框。我知道。在开发过程中,我可以读取NAME并在程序中对其进行硬编码。我怀疑控件名称没有保存在二进制代码中。我的理解是,控件ID、窗口句柄是在创建窗口时创建的,并且绝对没有引用控件名称(比如:txtOrderNumber)。如果对于按钮,由于按钮标题的原因,我可以指定(因此,我可以确定点击了哪个按钮),我会被EDIT类项目锁定,并在读取值时进行幸运的第一次猜测。我的问题是:如何从另一个窗口获取控件名称,对于此任务,我有兴趣了解EDIT类实例名称。以下是该项目的一些代码(缩写):

Dim hWnd As IntPtr=FindWindow(Nothing,_windowText)

'neneneba API:FindWindowEx'neneneba API:发送消息'neneneba API:GetClassName'neneneba API:GetWindowTextLength'neneneba API:GetWindowText'neneneba API:WM_GETTEXT

Public Shared Function GetClassValues(_controlClass As String, _hWindow As IntPtr) As List(Of String)
Dim cl As New List(Of String)
'First control handle in that class
Dim hc As IntPtr = FindWindowEx(_hWindow, IntPtr.Zero, _controlClass, vbNullString)
Do
Dim sv As String = GetWindowValue(hc)
cl.Add(sv)
'Next control (after hc) handle
hc = FindWindowEx(_hWindow, hc, _controlClass, vbNullString)
Loop Until hc = 0
Return cl
End Function
Public Shared Function GetWindowValue(_hWindow As IntPtr) As String
If _hWindow = IntPtr.Zero Then Return String.Empty
Dim sz As Integer = 256
Dim bf As IntPtr = Marshal.AllocHGlobal(sz)
Dim pt As IntPtr = SendMessage(_hWindow, WM_GETTEXT, sz, bf)
Dim rs As String = Marshal.PtrToStringUni(bf)
Marshal.Release(bf)
Return rs.Trim
End Function
Public Shared Function GetWindowClassName(_hWindow As IntPtr) As String
Dim ln As Integer = 256
Dim sb As New System.Text.StringBuilder("", ln)
GetClassName(_hWindow, sb, ln)
Return sb.ToString()
End Function
Public Shared Function GetWindowText(_hWindow As IntPtr) As String
Dim ln As Integer
If _hWindow.ToInt32 <= 0 Then Return String.Empty
ln = GetWindowTextLength(_hWindow)
If ln = 0 Then Return String.Empty
Dim sb As New System.Text.StringBuilder("", ln + 1)
GetWindowText(_hWindow, sb, sb.Capacity)
Return sb.ToString()
End Function

我看过GetWindowLong和GetDlgCtrlID API,并尝试了大多数标志,但到目前为止没有成功。。。

任何提示、线索和方向都将不胜感激。谢谢

我做了一个全局鼠标挂钩,这不是问题,而且GetWindowText和WM_GETTEXT工作得很好。事实上,该程序在这一点上运行良好且功能正常。检测到目标窗口后,我使用EnumChildWindows API将子窗口句柄保存在列表集合中,并仅筛选EDIT类窗口(与上面发布的GetClassValues函数的修改版本一起使用。此函数的参数是第一个EDIT类窗口句柄)。无论如何,我任意访问所需文本框的方式是使用此类窗口的保存列表和列表索引访问。正如我前面提到的,幸运的是,windows按照一致的顺序创建了THIS CHILD窗口。所以,在我的例子中,这个EDIT类窗口,文本框"对象",总是列表中的第一个,尽管主窗口中有很多。我想得到文本框"对象"名称,比如我前面提到的"txtCountNumber"…

最新更新