C# 如何回显到现有的CMD窗口

C# 如何回显到现有的CMD窗口,c#,C#,因此,我正在处理的程序可以使用CMD中的命令行启动,使用以下代码 string[] commandLines = Environment.GetCommandLineArgs(); 但是,我希望能够在处理命令行之后将消息返回到命令行所在的CMD窗口。任何帮助都将不胜感激 编辑:我正在以Windows应用程序而不是控制台应用程序的形式运行该程序。如果运行控制台应用程序,您希望使用该类与之交互 Console.WriteLine("Text"); 如果您正在运行windows窗体应用程序,请阅读

因此,我正在处理的程序可以使用CMD中的命令行启动,使用以下代码

string[] commandLines = Environment.GetCommandLineArgs();
但是,我希望能够在处理命令行之后将消息返回到命令行所在的CMD窗口。任何帮助都将不胜感激

编辑:我正在以Windows应用程序而不是控制台应用程序的形式运行该程序。

如果运行控制台应用程序,您希望使用该类与之交互

Console.WriteLine("Text");
如果您正在运行windows窗体应用程序,请阅读。

您可以使用.NET类向您不拥有的应用程序发送击键。目标应用程序必须处于活动状态才能检索击键。因此,在发送之前,您必须激活目标应用程序。您可以通过获取窗口的一个句柄,并用句柄将pinvow输入SetForegroundWindow来实现这一点

下面是一些示例代码,可以帮助您开始:

    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    private static extern IntPtr FindWindow(string lp1, string lp2);

    [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    private void button1_Click(object sender, EventArgs e)
    {
        IntPtr handle = FindWindow("ConsoleWindowClass", "Eingabeaufforderung");
        if (!handle.Equals(IntPtr.Zero))
        {
            if (SetForegroundWindow(handle))
            {
                // send 
                SendKeys.Send("Greetings from Postlagerkarte!");
                // send key "Enter"
                SendKeys.Send("{ENTER}");
            }
        }
    }

我最终解决了这个问题,使用了RenniePet发布的一个答案作为对我问题的评论。我将在下面列出解决方案,供任何试图复制它的人使用

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AttachConsole(int dwProcessId);

private const int ATTACH_PARENT_PROCESS = -1;

StreamWriter _stdOutWriter;

// this must be called early in the program
public void GUIConsoleWriter()
{
    // this needs to happen before attachconsole.
    // If the output is not redirected we still get a valid stream but it doesn't appear to write anywhere
    // I guess it probably does write somewhere, but nowhere I can find out about
    var stdout = Console.OpenStandardOutput();
    _stdOutWriter = new StreamWriter(stdout);
    _stdOutWriter.AutoFlush = true;

    AttachConsole(ATTACH_PARENT_PROCESS);
}

public void WriteLine(string line)
{
    GUIConsoleWriter();
    _stdOutWriter.WriteLine(line);
    Console.WriteLine(line);
}
将此代码添加到程序后,您可以简单地使用以下命令返回行

WriteLine("\nExecuting commands.");

stdout
是不够的吗?@Namfuak问题与c#有关。@ntl好的,我的意思是,考虑到这个问题获得了如此多的赞成票,Jeffrey Wieder的答案似乎太简单了,所以可能有一些复杂因素阻止OP使用它。很抱歉术语不好。可执行项目的输出类型是“控制台应用程序”还是“Windows应用程序”?或者我正在运行windows窗体应用程序,但您链接的问题的答案只能使我显示一个包含所需消息的新窗口。不允许我在现有的CMD窗口中显示它。谢谢你的回答。这实际上是可行的,但是它会将您正在做的任何事情显示为额外的行。因此,如果您想显示一条消息,它将是“echo blabla”,这将导致两行。所以从技术上来说这是可行的,但我更喜欢找更干净的。我不明白你的意思。SendKeys不发送回车。所以,只要你不发送{enter}命令,所有内容都放在一行上。但是在某个时候,我必须按enter键,在这一点上,它会向我显示一个错误,因为“来自Postlagerkarte的问候语!”不是有效的命令。举个例子。我最终使用了另一个解决方案,我在下面发布了这个解决方案。您必须使用shell的echo命令来避免这种情况。因此,您可以发送“echo hello&&echo reach”+{enter},它不会被解释为命令。然而,如果你永远不打算发送一个真正的命令,那么使用AttachConsoleAPI确实是更好的选择,尽管会,因为我已经尝试过了。这将导致我在最初的评论中提到的内容,即“回应来自Postlagerkarte的问候!”然后在下面的一行中提到“来自Postlagerkarte的问候!”即,你会看到它两次。一次作为命令,另一次作为该命令的结果。不过,我还是解决了,所以没关系。