0

我正在尝试从另一个应用程序的 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
4

2 回答 2

4

可以使用 Win32 API 执行此操作的唯一方法是,如果要抓取其文本的项目是 Win32 控件,并由实际窗口支持。

这就是为什么如果另一个项目是文本框或标签它可以正常工作的原因,因为它们都是分别使用 Win32EDITSTATIC控件实现的。

我不知道您所说的“面板”到底是什么意思,但我猜它是由其他应用程序自定义绘制的。因此,您需要向该应用程序询问它包含的文本。Windows 无法将其提供给您,因为它不是标准的 Windows 控件。如果您无法询问其他应用程序,无论出于何种原因,您都需要研究替代方法,例如 UI 自动化

如果“面板”是指一个组框,那么这只是一个标准的 Windows 按钮控件,它有一个标题(显示在顶部)。您可以像检索标签控件的标题一样检索它。在 Win32 术语中,这意味着向控件发送WM_GETTEXT消息。

于 2013-03-11T12:07:01.130 回答
0

这是我使用的解决方案: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

希望它会帮助某人

于 2013-03-15T10:24:11.643 回答