从已经运行的CMD窗口(vb.net)捕获文本



有一个应用程序在该计算机上几乎24/7运行。它是在命令提示符窗口中运行的。我希望能够捕获窗口中当前显示的所有文本。

该应用程序已经在运行(由于无关的原因,无法从VB内启动(,因此我不能仅重定向流程的输出来保存文本。

我当前捕获文本的方法具有以下代码:

SendKeys.SendWait("^(a)")
SendKeys.SendWait("^(a)")
SendKeys.SendWait("{enter}")
Dim CmdText As String = Clipboard.GetText
Clipboard.Clear()

上面的代码将所有命令发送到窗口(它将其发送两次,否则未捕获整个Windows文本(。然后,它击中Enter键将其加载到剪贴板中。然后,我将剪贴板内容保存到变量。它运行良好,但主要问题是它需要窗口重点放在焦点中。

无论如何,如果目前不在焦点之外,是否有从CMD窗口捕获文本?

编辑:我认为我接近使用sendmessage/postmessage找到解决方法。这是当前的代码:

Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Const WM_CHAR As Long = &H102
Private Const VK_CONTROL = &H11
Private Const VK_RETURN = &HD
Public Function GetWindowHandle(ByVal processName As String) As IntPtr
    processName = System.IO.Path.GetFileNameWithoutExtension(processName)
    Dim p() = Process.GetProcessesByName(processName)
    Return If(p.Length > 0, p(0).MainWindowHandle, IntPtr.Zero)
End Function
Private Sub GetText()
Dim h As Long = GetWindowHandle("programname.exe")
SendMessage(h, WM_CHAR, 1, 0) 'suppose to simulate Ctrl + A
SendMessage(h, WM_CHAR, 1, 0) 'suppose to simulate Ctrl + A
PostMessage(h, WM_KEYDOWN, VK_RETURN, 0) 'sends enter key to load text into clipboard
End Sub

问题在于,它不是发送ctrl a到命令窗口,而只是发送文本 ^a。有什么想法吗?

我已经写了一个名为 inputhelper 的库,在这里可能会派上用场。它包括执行输入模拟的不同方法,将其发送到特定的窗口。

从GitHub下载:
https://github.com/visual-vincent/inputhelper/releases

它的Wiki远非完整,但是库本身包括XML文档描述了其中的每个方法(当您在键入时弹出的成员列表中选择一个方法或成员时,它会自动显示。

库当前包括四个主要类别:

  • InputHelper.Hooks :用于捕获系统范围的类(有时称为 global (鼠标和键盘输入。可用于制作例如热键。

  • InputHelper.Keyboard :模拟真实键盘输入/键击的方法。

  • InputHelper.Mouse :模拟真实鼠标输入的方法。

  • InputHelper.WindowMessages :以更虚拟级别模拟鼠标和键盘输入的方法,例如针对特定的窗口。这利用窗口消息(因此SendMessage()PostMessage()(。

最后一个提到的将是您的兴趣之一。使用InputHelper.WindowMessages.SendKeyPress(),您可以将特定的键冲程发送到您选择的窗口,或者如果省略了当前活动的窗口。

类似的东西应该有效:

Dim hWnd As IntPtr = GetWindowHandle("programname.exe")
'Send CTRL + A twice.
InputHelper.WindowMessages.SendKeyPress(hWnd, Keys.Control Or Keys.A)
InputHelper.WindowMessages.SendKeyPress(hWnd, Keys.Control Or Keys.A)
'Send ENTER.
InputHelper.WindowMessages.SendKeyPress(hWnd, Keys.Enter)

请注意,执行Keys.Control Or Keys.A发送组合 ctrl a ,但是使用Keys.ControlKeys.Alt或CC_11(或组合(时,这起作用。使用任何其他键(例如Keys.A Or Keys.BKeys.ControlKey Or Keys.A(无法使用。

最新更新