【问题标题】:How do I write to command line from a WPF application?如何从 WPF 应用程序写入命令行?
【发布时间】:2010-06-16 23:16:28
【问题描述】:

您好,我知道如何写入控制台,但是如果我在程序中写入控制台并从命令行调用我的程序,它将不会显示任何内容。

如何做到这一点,以便当我说 Console.WriteLine 或 Console.Out.Writeline 时,ir 打印到调用它的命令提示符而不是其他地方?

我又一次知道如何做 Console.WriteLine 所以不是这样 :-p 除非我做错了。

据我所知,这可能与 Console.SetOut(TextWriter t) 有关

这是一个 WPF 应用程序,我需要它在启动时仍保留 GUI 的同时将其数据发布到命令行。我已经三重检查并且我的代码命中了打印行,我实际上可以看到打印到 Visual Studio 输出窗口的行,当我在没有 VS 的情况下手动运行它时,它不会显示在命令行中。

如果可能,我需要有条件地显示控制台。即,如果从命令行运行(甚至使用命令参数),则显示或发布到提示符,否则不要。

【问题讨论】:

  • 你能添加更多代码吗?
  • 应该可以,需要更多信息/代码
  • 好的。我想在命令行中打印一个带有帮助信息的字符串,保存在我的字符串“helpString”中。 Console.WriteLine(helpString);如果我打开它,导航到我的可执行文件并运行它,这不会将字符串输出到命令提示符。据我所知,它必须在其他地方打印输出。所以我尝试使用 Console 类的 SetOut 方法,但我不知道在哪里可以获得适用于命令提示符的 StreamWriter。真的没有比这更多的代码了。这是一个 WPF 项目,以防万一。
  • 这是同一个问题,但它没有解决,因为我不想创建一个新的命令提示符,而是将输出发布到命令提示符,如果它有参数,它会有条件地启动可执行文件如果没有控制台,甚至会打扰。

标签: c# wpf command-line console


【解决方案1】:

这其实很简单:

public void WriteToConsole(string message)
{
  AttachConsole(-1);
  Console.WriteLine(message);
}
[DllImport("Kernel32.dll")]
public static extern bool AttachConsole(int processId);

如果您的程序是从命令行启动的,此方法会将您的消息写入控制台,否则它什么也不做。

如果您想在未从命令行启动时使用另一种输出机制,您可以这样做:

public void WriteToConsole(string message)
{
  _connected = _connected || AttachConsole(-1);
  if(_connected)
    Console.WriteLine("Hello");
  else
    ... other way to output message ...
}
bool _connected;
[DllImport("Kernel32.dll")]
public static extern bool AttachConsole(int processId);

【讨论】:

  • 不错。我有一个小问题,从命令行运行时控制台窗口(会话?)没有退出。添加这个可以解决它:“SendKeys.SendWait ("{ENTER}");”。我还添加了对 FreeConsole() 的调用。
  • 这很酷,但是如何获得它以便命令行提示符返回呢?我得到的是提示,然后开始编写控制台,因此最终用户不会留下 c:\> 提示。
【解决方案2】:

这个特定任务的完整代码是:

    public static void WriteToConsole(string message)
    {
        AttachConsole(-1);
        System.Console.WriteLine(message);
        SendKeys.SendWait("{ENTER}");
        FreeConsole();
    }

    [DllImport("Kernel32.dll")]
    private static extern bool AttachConsole(int processId);

    [DllImport("kernel32.dll")]
    private static extern bool FreeConsole();

所有功劳归于 Ray Burns 和 Scott Marlowe。

【讨论】:

    【解决方案3】:

    将项目类型设置为“控制台应用程序”而不是“Windows 应用程序”。这将导致应用程序附加到启动它的控制台(如果还没有控制台,则创建一个控制台)。

    【讨论】:

    • 有没有办法有条件地做到这一点?就像如果进程是从命令行运行的,它会附加到命令行,否则它不会?
    • 本,我从来没有听说过这样的事情,但那将是一个很酷的把戏。我猜你可能能够检测到父进程,也就是控制台窗口。
    • @ben:没有简单的方法 - 但是,乔纳森的方法很可能会奏效。您需要使用调用控制台的进程 ID 调用 AttachConsole。见:msdn.microsoft.com/en-us/library/ms681952(VS.85).aspx
    • @ben:那么你会遇到其他问题 - Windows 2000 也不支持 WPF - msdn.microsoft.com/en-us/library/8z6watww.aspx
    • 哦,有趣,好吧,也许这真的是解决方案
    【解决方案4】:

    这应该可以正常工作,双重和三重检查您所做的工作,并在可能的情况下发布您的代码。您可以查看项目属性并检查输出类型是否设置为“控制台应用程序”(我相信无论如何它都会这样调用:oP)

    【讨论】:

    • 这是一个 WPF 应用程序,我需要它将数据发布到命令行,同时在启动时仍保留 GUI。我已经三重检查并且我的代码命中了打印行,我实际上可以看到打印到 Visual Studio 输出窗口的行,当我在没有 VS 的情况下手动运行它时,它不会显示在命令行中。
    • 本所有这些 cmets 都包含与问题相关的信息,请您将这些信息添加到问题中。谢谢。
    • 我已更新问题以反映附加信息。对此感到抱歉。
    猜你喜欢
    • 2013-08-26
    • 2013-07-18
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2010-10-14
    • 2020-09-19
    • 2016-02-02
    • 1970-01-01
    相关资源
    最近更新 更多