从Windows应用程序中的文本框中截取文本

Jas*_*ord 5 c# c++ winapi screen-scraping winforms

是否可以从单独的可执行文件中包含的文本框中删除文本?我有一个具有调试窗口的应用程序.调试窗口生成详细日志.但是,日志永远不会保存在任何地方,只能在应用程序中查看.如果应用程序生成异常,我想通过电子邮件发送自己知道已经生成了异常,因此我可以跳进去检查一下.还有一个用于复制文本框的按钮,因此我正在考虑使用Spy ++来获取命令信息.但是,我不知道从那里去哪里.任何指针都非常感谢.

我更喜欢在.NET中使用C#,但如果我需要使用C++,我会的.

更新:

根据评论,我尝试了以下操作:

Private Declare Function GETWINDOWTEXT Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer
Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Integer) As Integer
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindow As String) As IntPtr
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
Private Declare Ansi Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer
Private Const WM_GETTEXT As Short = &HDS
Private Const WM_GETTEXTLENGTH As Short = &HES

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim hwnd As Integer = FindWindowEx(0, 0, "MyAppForm", "Hello World")

    If Not hwnd = 0 Then
        SetForegroundWindow(hwnd)

        'Dim LabelEx As Integer = FindWindowEx()
        Dim TextBoxEx As Integer = FindWindowEx(hwnd, 0, "MyAppTextBox", vbNullString)
        Dim txtLength As Long = SendMessage(TextBoxEx, WM_GETTEXTLENGTH, CInt(0), CInt(0)) + 1
        Dim txtBuff As String = Space(txtLength)
        Dim txtValue As Long = SendMessage(TextBoxEx, WM_GETTEXT, txtLength, txtBuff)

        MsgBox(txtBuff)
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

但是,我似乎无法找到文本框控件的句柄.当我枚举所有窗口时,我只看到一个TextBox对象,但我在整个枚举中多次看到父窗口.如何获取窗口中控件的指针?

更新2:

我上传了一个示例Windows应用程序,以显示我正在尝试访问的应用程序类型.除了文本框之外,我还试图获取两个标签的值.文本框是最重要的.示例Win应用程序位于:http://www.mediafire.com/file/172r2xapj7p4f2f/StatusSimulator.zip

Ray*_*hen 4

文本抓取是通过辅助功能接口完成的。对于托管代码,您可以使用命名空间中的类System.Windows.Automation。如果您已经有窗口句柄,那么提取文本很简单:

AutomationElement.FromHandle(hwnd)
                 .GetCurrentPropertyValue(ValuePattern.ValueProperty) as string;
Run Code Online (Sandbox Code Playgroud)

(有点困惑,因为问题被标记为 C# 并且您要求 C# 解决方案,但您的代码示例是用 VB 编写的。)