无法从另一个应用程序的面板控件中获取文本
Posted
技术标签:
【中文标题】无法从另一个应用程序的面板控件中获取文本【英文标题】:NO WAY to get the text from a panel control of another application 【发布时间】:2013-02-26 12:13:33 【问题描述】:我正在尝试从另一个应用程序的 Windows 窗体中获取信息。
我可以从该应用程序的文本框或标签中读取数据,但不能从面板中读取数据,因为该面板不包含控件。
我需要你的建议。
提前致谢。 这是我正在使用的代码:
For Each top As windowsAPIoutils.ApiWindow In enumerator.GetTopLevelWindows()
For Each child As windowsAPIoutils.ApiWindow In enumerator.GetChildWindows(top.hWnd)
If top.MainWindowTitle.StartsWith("TITLE_Of_APPLICATION") Then
'The class name of the control
If child.ClassName = "TEdit" Then
textbox1.Text = child.MainWindowTitle
End If
End If
Next child
Next top
【问题讨论】:
请更准确一些。并给出一个代码示例。 我使用 Win32API 来获取文本内容。它可以工作,但是当我想从面板获取文本时,这是不可能的。 这没有用,你必须给一些代码。 我认为你可以做一个方法以某种风格与其他方法进行通信。例如,相关帖子是vb-helper.com/howto_get_other_app_text.html。但是,您的问题非常模棱两可,您必须决定这两个应用程序如何相互通信。 hello user1929959,我想将显示的文本从应用程序复制到文本框。当显示的文本位于(文本框、标签、组合框)之类的“控件”中时,这是可能的,但不可能当它在“面板”中时。谢谢 【参考方案1】:您可以使用 Win32 API 执行此操作的唯一方法是,如果您要抓取其文本的项目是 Win32 控件,并由实际窗口支持。
这就是为什么如果另一个项目是文本框或标签则可以正常工作的原因,因为它们都分别使用 Win32 EDIT
和 STATIC
控件实现。
我不知道您所说的“面板”究竟是什么意思,但我猜它是由其他应用程序自定义绘制的。因此,您需要向该应用程序询问它包含的文本。 Windows 无法将其提供给您,因为它不是标准的 Windows 控件。如果您无法询问其他应用程序,无论出于何种原因,您都需要研究alternative methods, like UI automation。
如果“面板”是指group box,那么这只是一个标准的 Windows 按钮控件,它有一个标题(显示在顶部)。您可以像检索标签控件的标题一样检索它。在 Win32 术语中,这意味着向控件发送 WM_GETTEXT
message。
【讨论】:
感谢您的帮助。我正在谈论的面板是“TPANEL”,因为该应用程序在 Delphi 中。我正在尝试使用 OCR,希望它能解决我的问题【参考方案2】:这是我使用的解决方案: Tesseract 一个开源 OCR 引擎,这里是获取它的链接:https://code.google.com/p/tesseract-ocr/
如何使用它:
Imports System.IO
Imports System.Threading
Imports System.Collections.Specialized
Public class myClass
Private ProcessList As New Hashtable
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button.Click
Dim croppedFile as String = "C:\image.tif"
Dim OCRProcess As Process = New Process()
OCRProcess.StartInfo.FileName = "C:\tesseract\tesseract.exe"
OCRProcess.StartInfo.Arguments = croppedFile & " " & croppedFile & " -l eng"
OCRProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
OCRProcess.StartInfo.CreateNoWindow = True
OCRProcess.EnableRaisingEvents = True
AddHandler OCRProcess.Exited, AddressOf Me.ProcessExited
OCRProcess.Start()
ProcessList.Add(OCRProcess.Id.ToString, croppedFile & ".txt")
Do While Not OCRProcess.HasExited
Application.DoEvents()
Loop
End Sub
Friend Sub ProcessExited(ByVal sender As Object, ByVal e As System.EventArgs)
Dim Proc As DictionaryEntry
Dim oRead As StreamReader
Dim EntireFile As String = ""
For Each Proc In ProcessList
If (sender.id.ToString = Proc.Key) Then
oRead = File.OpenText(Proc.Value)
EntireFile = oRead.ReadToEnd()
End If
Next
MsgBox(EntireFile)
End Sub
End Class
希望对大家有所帮助
【讨论】:
以上是关于无法从另一个应用程序的面板控件中获取文本的主要内容,如果未能解决你的问题,请参考以下文章