5

外部アプリケーションのテキストボックスからテキストを取得できますが、外部アプリケーションの目的のテキストボックスからテキストを取得したいと思います。私の英語はあまり上手ではないので、下の画像を参照してください。

ここに画像の説明を入力してください

以下のコードは、最初のテキストボックスの値のみを返します。

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
4

2 に答える 2

1

メイン ウィンドウ (外部アプリケーション) の子をループして、それらのプロパティを取得する必要があります。以下を使用します。

<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

詳細については、VB.Net を使用してポップアップ メッセージ ボックスに含まれるコントロールのプロパティを取得する方法を確認してください。

于 2014-07-14T14:39:41.707 に答える
0

'これを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
于 2016-08-10T13:18:27.060 に答える