【发布时间】:2012-01-12 13:21:56
【问题描述】:
是否可以从包含在单独可执行文件中的文本框中抓取文本?我有一个具有调试窗口的应用程序。调试窗口生成详细日志。但是,日志永远不会保存在任何地方,只能在应用程序中查看。如果应用程序产生异常,我想给自己发电子邮件,知道已经产生了异常,这样我就可以跳进去检查一下。还有一个复制文本框的按钮,所以我正在考虑使用 Spy++ 来获取命令信息。但是,我不知道从那里去哪里。任何指针都非常感谢。
我更喜欢在 .NET 中使用 C#,但如果我需要使用 C++,我会。
更新:
基于 cmets,我尝试执行以下操作:
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
但是,我似乎找不到文本框控件的句柄。当我枚举所有窗口时,我只看到一个 TextBox 对象,但在整个枚举过程中我多次看到父对象。如何获得指向窗口内控件的指针?
更新 2:
我上传了一个示例 Windows 应用程序,以显示我尝试访问的应用程序类型。除了文本框之外,我还试图获取两个标签的值。文本框是最重要的。示例 Win 应用在这里:http://www.mediafire.com/file/172r2xapj7p4f2f/StatusSimulator.zip
【问题讨论】:
-
一个问题:你怎么知道发生了异常?
-
您的独立可执行文件是 .Net 应用程序吗?
-
你试过Ctrl A -> Ctrl C
-
找到windows hwnd然后发送wm_gettext,看看@stackoverflow.com/questions/7732705/…说明原理
-
@AlexK,你或许应该把这个作为答案。
标签: c# c++ winforms winapi screen-scraping