2013-03-11 3 views
0

Я пытаюсь получить информацию из формы окна другого приложения.NO WAY, чтобы получить текст с панели управления другим приложением

Я могу читать данные из текстового поля или метки этого приложения, но не из ПАНЕЛИ, потому что эта панель не содержит элементов управления.

Мне нужны ваши предложения.

Заранее спасибо. Вот код, который я использую:

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 
+0

Пожалуйста, будьте намного точнее. И дайте пример кода. – Sebastian

+0

Я использовал Win32API для получения текстового контента. Он работает, но когда я хочу получить текст с панели, это невозможно. – vertebre

+0

Это не поможет, вы должны дать какой-то код. – Sebastian

ответ

0

Вот решение, которое я использовал: Тессеракта с открытым исходным кодом 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 

Надеется, что это поможет кому-то

4

Единственный способ, который вы можете использовать API Win32, чтобы сделать это, если деталь, текст которой вы хотите, чтобы захватить это управление Win32, подкрепленные фактическим окном ,

Именно поэтому он отлично работает, если другой элемент представляет собой текстовое поле или ярлык, потому что они оба реализованы с использованием элементов управления Win32 EDIT и STATIC соответственно.

Я не знаю точно, что вы подразумеваете под «панелью», но я предполагаю, что это было выполнено на заказ другим приложением. Поэтому вам нужно будет запросить это приложение для содержащегося в нем текста. Windows не может дать его вам, потому что это не стандартный элемент управления Windows. Если вы не можете запросить другое приложение, по какой-либо причине вам понадобится исследование alternative methods, like UI automation.

Если вы используете «панель», вы имеете в виду group box, и тогда это стандартное управление кнопкой Windows, и у него есть подпись (отображается вверху). Вы можете получить это так же, как вы бы получили заголовок элемента управления меткой. В терминах Win32 это означает отправку элемента управления WM_GETTEXT message.

+0

Спасибо за помощь. Панель, о которой я говорю, является «TPANEL», потому что приложение находится в Delphi. Я пытаюсь использовать OCR, надеюсь, что это решит мою проблему – vertebre

Смежные вопросы