vb.net 从外部应用程序的特定文本框中获取文本 - Visual Basic .Net

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14090479/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-17 11:42:59  来源:igfitidea点击:

Get Text From Specific Textboxes From External Application - Visual Basic .Net

vb.netvb.net-2010external-application

提问by Muhammad Saqib

I can get text from external application text box but now I want to get text from my desired text box from external application. My English is not so good that's why see Image Below.

我可以从外部应用程序文本框中获取文本,但现在我想从外部应用程序的所需文本框中获取文本。我的英语不是很好,这就是为什么看到下面的图片。

enter image description here

在此处输入图片说明

The Below Code Return The First Text Box Value Only.

下面的代码仅返回第一个文本框值。

Imports System.Runtime.InteropServices


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


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    'Find the running notepad window
    Dim Hwnd As IntPtr = FindWindow(Nothing, TextBox1.Text)

    'Alloc memory for the buffer that recieves the text
    Dim Handle As IntPtr = Marshal.AllocHGlobal(100)

    'send WM_GWTTEXT message to the notepad window
    Dim NumText As Integer = SendMessage(Hwnd, WM_GETTEXT, 50, Handle)

    'copy the characters from the unmanaged memory to a managed string
    Dim Text As String = Marshal.PtrToStringUni(Handle)

    'Display the string using a label
    Label1.Text = Text

    'Find the Edit control of the Running Notepad
    Dim ChildHandle As IntPtr = FindWindowEx(Hwnd, IntPtr.Zero, "Edit", Nothing)

    'Alloc memory for the buffer that recieves the text
    Dim Hndl As IntPtr = Marshal.AllocHGlobal(200)

    'Send The WM_GETTEXT Message
    NumText = SendMessage(ChildHandle, WM_GETTEXT, 200, Hndl)

    'copy the characters from the unmanaged memory to a managed string
    Text = Marshal.PtrToStringUni(Hndl)

    'Display the string using a label
    Label2.Text = Text


End Sub

End Class

回答by Saleem

You'll have to loop through children of the main window (External Application) and get their properties. You'll use the following:

您必须遍历主窗口(外部应用程序)的子窗口并获取它们的属性。您将使用以下内容:

<DllImport("User32.dll")> _
    Public Function EnumChildWindows _
        (ByVal WindowHandle As IntPtr, ByVal Callback As EnumWindowProcess, _
        ByVal lParam As IntPtr) As Boolean
    End Function

    Public Delegate Function EnumWindowProcess(ByVal Handle As IntPtr, ByVal Parameter As IntPtr) As Boolean

Public Function GetChildWindows(ByVal ParentHandle As IntPtr) As IntPtr()
    Dim ChildrenList As New List(Of IntPtr)
    Dim ListHandle As GCHandle = GCHandle.Alloc(ChildrenList)
    Try
        EnumChildWindows(ParentHandle, AddressOf EnumWindow, GCHandle.ToIntPtr(ListHandle))
    Finally
        If ListHandle.IsAllocated Then ListHandle.Free()
    End Try
    Return ChildrenList.ToArray
End Function

For for details, check this How can I get properties of controls contained in a popup message box using VB.Net

有关详细信息,请检查此如何使用 VB.Net 获取弹出消息框中包含的控件的属性

回答by sumanth

' try this on excel vbe

' 在 excel vbe 上试试这个

External_application_handle=findwindow(vbNullString,"External_application")
textbox_1_handle=findwindowex(External_application_handle,0&,"Edit",vbNullString)
next_handle=textbox_1_handle
textbox_2_handle=findwindowex(External_application_handle,next_handle,"Edit",vbNullString")
Length = SendMessage(textbox_2_handle, WM_GETTEXTLENGTH, 0,0)
buffer$=space(Length)
call sendmessage(textbox_2_handle,Length+1,buffer$)
msgbox buffer