منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : كيف يمكنني استعمال GetWindowText
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم
كيف يمكنني نسخ  حقل تيكست من برنامج مفتوح امامي ليس من برمجتي
الي حقل تيكست في برنامجي
وجدت هذا الكود لكن به الكثير من المشاكل
رابط الموضوع الاصلي
كود :
Imports System.Collections.Generic
Imports System.Runtime.InteropServices
Imports System.Text
Imports System.Text.RegularExpressions


Public Class Form1

   Private Const WM_GETTEXT As Integer = &HD

   Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr

   <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
   Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, _
                                    ByVal childAfter As IntPtr, _
                                    ByVal lclassName As String, _
                                    ByVal windowTitle As String) As IntPtr
   End Function

   Declare Auto Function FindWindow Lib "user32.dll" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr

   Dim PagerInformation As String = ""

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

   End Sub

   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       PagerInformation = ""
       RichTextBox1.Text = ""
       Dim enumerator As New WindowsEnumerator()
       For Each top As ApiWindow In enumerator.GetTopLevelWindows()
           For Each child As ApiWindow In enumerator.GetChildWindows(top.hWnd)
               PagerInformation += top.MainWindowTitle & "    " & child.ClassName & "    " & child.hWnd.ToString & "    " & child.MainWindowTitle & "////" & vbCrLf & vbCrLf
           Next child
       Next top
       RichTextBox1.Text = PagerInformation
       '.....................................................................Name of application goes here followed by (.*?)////
       Dim PagersData As MatchCollection = Regex.Matches(PagerInformation, "Pager Test Application(.*?)////", RegexOptions.IgnoreCase)
       

       'You will probably have more matches for your pager application because it has more controls on it I believe.
       'You just need to determine which index match the pager text and pager phnr are at. Whenever I start my pager test application
       'the data for controls, etc, always appears in the same order so when it is matched pager text and phnr are always
       'at the same index.

       Dim PagerText As String = PagersData.Item(4).ToString & vbCrLf
       Dim PagerPhnr As String = PagersData.Item(7).ToString & vbCrLf

       PagerText = Regex.Replace(PagerText, "    ", "/")
       PagerPhnr = Regex.Replace(PagerPhnr, "    ", "/")

       RichTextBox2.AppendText(PagerText & vbCrLf & PagerPhnr)

       Dim Text As MatchCollection = Regex.Matches(PagerText, "/(.*?)/", RegexOptions.IgnoreCase)
       Dim Phnr As MatchCollection = Regex.Matches(PagerPhnr, "/(.*?)/", RegexOptions.IgnoreCase)

       Dim SMSText As String = Text.Item(1).ToString
       Dim SMSPhnr As String = Phnr.Item(1).ToString

       SMSText = Regex.Replace(SMSText, "/", "")
       SMSPhnr = Regex.Replace(SMSPhnr, "/", "")

       RichTextBox3.AppendText(SMSText & vbCrLf & SMSPhnr)

       TextBox1.Text = SMSPhnr
       TextBox2.Text = SMSText

   End Sub

   Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged

   End Sub

   Private Sub RichTextBox2_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox2.TextChanged

   End Sub

   Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged

   End Sub

   Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged

   End Sub

   Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click

   End Sub

   Private Sub RichTextBox3_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox3.TextChanged

   End Sub

   Private Sub Label3_Click(sender As Object, e As EventArgs) Handles Label3.Click

   End Sub

   Private Sub Label4_Click(sender As Object, e As EventArgs) Handles Label4.Click

   End Sub
End Class


Public Class ApiWindow
   Public MainWindowTitle As String = ""
   Public ClassName As String = ""
   Public hWnd As Int32
End Class

''' <summary>
''' Enumerate top-level and child windows
''' </summary>
''' <example>
''' Dim enumerator As New WindowsEnumerator()
''' For Each top As ApiWindow in enumerator.GetTopLevelWindows()
'''    Console.WriteLine(top.MainWindowTitle)
'''    For Each child As ApiWindow child in enumerator.GetChildWindows(top.hWnd)
'''        Console.WriteLine(" " + child.MainWindowTitle)
'''    Next child
''' Next top
''' </example>
Public Class WindowsEnumerator

   Private Delegate Function EnumCallBackDelegate(ByVal hwnd As Integer, ByVal lParam As Integer) As Integer

   ' Top-level windows.
   Private Declare Function EnumWindows Lib "user32" _
    (ByVal lpEnumFunc As EnumCallBackDelegate, ByVal lParam As Integer) As Integer

   ' Child windows.
   Private Declare Function EnumChildWindows Lib "user32" _
    (ByVal hWndParent As Integer, ByVal lpEnumFunc As EnumCallBackDelegate, ByVal lParam As Integer) As Integer

   ' Get the window class.
   Private Declare Function GetClassName _
    Lib "user32" Alias "GetClassNameA" _
    (ByVal hwnd As Integer, ByVal lpClassName As StringBuilder, ByVal nMaxCount As Integer) As Integer

   ' Test if the window is visible--only get visible ones.
   Private Declare Function IsWindowVisible Lib "user32" _
    (ByVal hwnd As Integer) As Integer

   ' Test if the window's parent--only get the one's without parents.
   Private Declare Function GetParent Lib "user32" _
    (ByVal hwnd As Integer) As Integer

   ' Get window text length signature.
   Private Declare Function SendMessage _
    Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32

   ' Get window text signature.
   Private Declare Function SendMessage _
    Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As StringBuilder) As Int32

   Private _listChildren As New List(Of ApiWindow)
   Private _listTopLevel As New List(Of ApiWindow)

   Private _topLevelClass As String = ""
   Private _childClass As String = ""

   ''' <summary>
   ''' Get all top-level window information
   ''' </summary>
   ''' <returns>List of window information objects</returns>
   Public Overloads Function GetTopLevelWindows() As List(Of ApiWindow)

       EnumWindows(AddressOf EnumWindowProc, &H0)

       Return _listTopLevel

   End Function

   Public Overloads Function GetTopLevelWindows(ByVal className As String) As List(Of ApiWindow)

       _topLevelClass = className

       Return Me.GetTopLevelWindows()

   End Function

   ''' <summary>
   ''' Get all child windows for the specific windows handle (hwnd).
   ''' </summary>
   ''' <returns>List of child windows for parent window</returns>
   Public Overloads Function GetChildWindows(ByVal hwnd As Int32) As List(Of ApiWindow)

       ' Clear the window list.
       _listChildren = New List(Of ApiWindow)

       ' Start the enumeration process.
       EnumChildWindows(hwnd, AddressOf EnumChildWindowProc, &H0)

       ' Return the children list when the process is completed.
       Return _listChildren

   End Function

   Public Overloads Function GetChildWindows(ByVal hwnd As Int32, ByVal childClass As String) As List(Of ApiWindow)

       ' Set the search
       _childClass = childClass

       Return Me.GetChildWindows(hwnd)

   End Function

   ''' <summary>
   ''' Callback function that does the work of enumerating top-level windows.
   ''' </summary>
   ''' <param name="hwnd">Discovered Window handle</param>
   ''' <returns>1=keep going, 0=stop</returns>
   Private Function EnumWindowProc(ByVal hwnd As Int32, ByVal lParam As Int32) As Int32

       ' Eliminate windows that are not top-level.
       If GetParent(hwnd) = 0 AndAlso CBool(IsWindowVisible(hwnd)) Then

           ' Get the window title / class name.
           Dim window As ApiWindow = GetWindowIdentification(hwnd)

           ' Match the class name if searching for a specific window class.
           If _topLevelClass.Length = 0 OrElse window.ClassName.ToLower() = _topLevelClass.ToLower() Then
               _listTopLevel.Add(window)
           End If

       End If

       ' To continue enumeration, return True (1), and to stop enumeration
       ' return False (0).
       ' When 1 is returned, enumeration continues until there are no
       ' more windows left.

       Return 1

   End Function

   ''' <summary>
   ''' Callback function that does the work of enumerating child windows.
   ''' </summary>
   ''' <param name="hwnd">Discovered Window handle</param>
   ''' <returns>1=keep going, 0=stop</returns>
   Private Function EnumChildWindowProc(ByVal hwnd As Int32, ByVal lParam As Int32) As Int32

       Dim window As ApiWindow = GetWindowIdentification(hwnd)

       ' Attempt to match the child class, if one was specified, otherwise
       ' enumerate all the child windows.
       If _childClass.Length = 0 OrElse window.ClassName.ToLower() = _childClass.ToLower() Then
           _listChildren.Add(window)
       End If

       Return 1

   End Function

   ''' <summary>
   ''' Build the ApiWindow object to hold information about the Window object.
   ''' </summary>
   Private Function GetWindowIdentification(ByVal hwnd As Integer) As ApiWindow

       Const WM_GETTEXT As Int32 = &HD
       Const WM_GETTEXTLENGTH As Int32 = &HE

       Dim window As New ApiWindow()

       Dim title As New StringBuilder()

       ' Get the size of the string required to hold the window title.
       Dim size As Int32 = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0)

       ' If the return is 0, there is no title.
       If size > 0 Then
           title = New StringBuilder(size + 1)

           SendMessage(hwnd, WM_GETTEXT, title.Capacity, title)
       End If

       ' Get the class name for the window.
       Dim classBuilder As New StringBuilder(64)
       GetClassName(hwnd, classBuilder, 64)

       ' Set the properties for the ApiWindow object.
       window.ClassName = classBuilder.ToString()
       window.MainWindowTitle = title.ToString()
       window.hWnd = hwnd

       Return window

   End Function

End Class