是否可以从包含在单独可执行文件中的文本框中抓取文本?我有一个具有调试窗口的应用程序。调试窗口生成详细的日志。但是,日志永远不会保存在任何地方,只能在应用程序中查看。如果应用程序生成异常,我想通过电子邮件告诉自己,已经生成了一个异常,这样我就可以跳进去查看了。还有一个按钮可以复制文本框,所以我想使用Spy++来获取命令信息。然而,我不知道从那里去哪里。任何指示都会受到极大的赞赏。
我更喜欢在C#中使用.NET,但是如果我需要使用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但是,我似乎找不到textbox控件的句柄。当我枚举所有窗口时,我只看到一个TextBox对象,但在整个枚举过程中多次看到父对象。如何获得窗口内控件的指针?
更新2:
我上传了一个示例Windows应用程序,以显示我想要访问的应用程序的类型。除了textbox之外,我还试图获取两个标签的值。文本框是最重要的。示例Win应用程序在这里:http://www.mediafire.com/file/172r2xapj7p4f2f/StatusSimulator.zip
发布于 2011-12-08 04:05:21
当您使用WM_GETTEXT消息时,您将提供一个指向接收文本的缓冲区的指针。如果要将此消息发送到另一个进程中的窗口,则所提供的指针将位于进程地址空间中,而不是其他进程中。
我做了一些类似的事情(在另一个进程中刮掉窗口),我所做的工作就是使用DLL注入。基本上,您使用SetWindowsHook并在DLL中提供回调。然后,操作系统将DLL加载到其他进程中,然后确定何时加载到所需的目标进程。此时,您的代码在另一个进程中,您可以获得窗口文本。
然后是把它带回你的应用程序的问题。我使用了一个共享内存块来实现它。也许有一种更简单的方法来做这一切,但这在过去对我有用。
https://stackoverflow.com/questions/8374531
复制相似问题