Как мне написать в командной строке из приложения WPF? - PullRequest
13 голосов
/ 17 июня 2010

Привет, я знаю, как писать в консоль, но если я напишу в консоль в своей программе и вызову свою программу из командной строки, она ничего не отобразит.

Как мне сделать так, чтобы, когда яскажем Console.WriteLine или Console.Out.Writeline ir печатает в командную строку, из которой он был вызван, а не где-то еще?

Еще раз я знаю, как сделать Console.WriteLine, так что это не так :-p, еслиЯ делаю это неправильно.

Из того, что я могу сказать, это, вероятно, что-то делать с Console.SetOut (TextWriter t)

это приложение WPF, и мне нужно, чтобы оно опубликовало свои данныев командной строке при сохранении GUI при запуске.Я трижды проверил, и мой код попал в строки печати, я действительно могу видеть строки, печатаемые в окне вывода Visual Studio, он просто не будет отображаться в командной строке при запуске вручную без VS.

Если возможно, мне нужно условно иметь консольный дисплей.то есть, если он запускается из командной строки (или даже с аргументами команды), отображать или публиковать в приглашении, в противном случае - нет.

Ответы [ 4 ]

31 голосов
/ 17 июня 2010

Это на самом деле тривиально:

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);
0 голосов
/ 19 июля 2018

Полный код для этой конкретной задачи:

    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();

Все кредиты принадлежат Рэю Бернсу и Скотту Марлоу.

0 голосов
/ 17 июня 2010

Установите тип проекта «Консольное приложение» вместо «Приложение Windows». Это приведет к тому, что приложение будет подключено к консоли, с которой оно было запущено (или создаст консоль, если ее еще не было).

0 голосов
/ 17 июня 2010

Это должно работать просто отлично, дважды и трижды проверьте, что вы сделали, и, если возможно, опубликуйте свой код.Вы можете посмотреть в свойствах проекта и убедиться, что тип вывода установлен на «Консольное приложение» (я думаю, его так или иначе называют: oP)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...