【问题标题】:Input and Output text from long running console app (C++)来自长时间运行的控制台应用程序 (C++) 的输入和输出文本
【发布时间】:2013-07-06 08:32:45
【问题描述】:

我有一个长时间运行的控制台应用程序,它从 Windows 启动,或者可能由我正在编写的应用程序启动。

我向控制台应用程序发送密钥的成功有限,甚至不知道从哪里开始读取它的输出。是否可以从请求应用程序甚至未启动的控制台应用程序读取输出?

无论如何,两个问题...

如何模拟“返回”键? (这是我必须向应用程序发送特定密钥的内容,并且应用程序确实收到了密钥,但我似乎找不到如何模拟 ENTER 键。

do {
    hwndCurrentWindow = FindWindowA("ConsoleWindowClass", "My Other Console App");
    if (hwndCurrentWindow == 0) {
        break;
    }

    iStringLen = GetWindowTextW (hwndCurrentWindow, wcharWindowText, 500);
    if (iStringLen == 0) {
        continue;
    }

    SetActiveWindow(hwndCurrentWindow);
    printf("Sending '?'");
    SendMessage(hwndCurrentWindow, WM_CHAR, '?', 0);
    // '?' shows up in console app
    printf("Sending 'a'");
    SendMessage(hwndCurrentWindow, WM_CHAR, 'a', 0);
    // 'a' shows up in console app.
    //printf("Sending RETURN");
    //SendMessage(hwndCurrentWindow, WM_CHAR, VK_RETURN, 0);
    // nothing happens
    break;
} while (hwndCurrentWindow);

如何从控制台应用程序读取数据? (如果其他控制台应用程序没有连续运行,我只需将输出写入一个文件并读取它......哎呀这可能仍然有效)

我查看了一些选项,但我读到的许多选项都是针对 C# 的,遗憾的是我没有更改语言的奢侈。 C++ 有没有类似的选项?

Collect stdout output from a console app with C++ 这个不起作用,因为应用程序没有退出。所以它只是挂起等待。不断向缓冲区添加更多内容。

Catch console input-output

Capturing an c# executable output from another C# program

感谢您提供的任何帮助!

【问题讨论】:

    标签: c++ winapi console stdout stdio


    【解决方案1】:

    您需要将该应用程序的输入/输出重定向到您的主应用程序。这是关于此的文章:Creating a Child Process with Redirected Input and Output

    【讨论】:

    • 谢谢!我还看到了另一篇 MSDN 文章 (support.microsoft.com/kb/190351) 对此有何想法?
    • 基本上他们做同样的事情。您需要密切关注的一点是 CreateProcess() 函数调用和要使用的参数。您需要创建一组管道,然后在 CreateProcess() 中指定它们,以便它们用于在您的应用程序和您生成的进程之间进行通信。我相信你可以举任何例子来得到你需要的结果。
    • 这真的很有帮助!我取得了很大的成功。当我的应用程序完成时,我使用 PID 来终止应用程序,并且可以从控制台应用程序获取输出,但是使用 WriteToPipe 命令发送任何数据的运气为零。即使提供文件的有效路径也不会发送任何内容,我把在一个小的睡眠命令中,以确保它在尝试发送数据之前正在运行,或者我没有看到正在发送的数据,因为没有发送 ENTER。关于如何将字符串发送到 g_hChildStd_IN_Wr 管道的任何想法?还是那是 g_hChildStd_IN_Rd 管道?那是用过一次。文字墙。
    • 您不需要发送回车,您只需将数据发送到一侧的管道,然后在花药上接收。确保子应用程序正在运行(最好的测试方法是让它无限运行,总是等待来自管道的东西),上面的链接中有很好的客户端示例。根据该链接,您需要使用 g_hChildStd_IN_Wr 写入管道。
    • 首先你需要找出你的代码的哪一部分不能正常工作。它可能是发送方或接收方。要做到这一点 - 尝试在您的组件中使用 3rd 方示例(如上面的链接),这样您就会知道应该归咎于代码的哪一部分。然后,您可以简单地检查样本,以找出您到底做错了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 2021-02-14
    相关资源
    最近更新 更多