powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проект на WinForms перехватить Console.WriteLine
17 сообщений из 17, страница 1 из 1
Проект на WinForms перехватить Console.WriteLine
    #39785750
Привет, форумчане!
Я в своём проекте (WinForms Net Framework 4.6.2) использую стороннюю dll-сборку, установленную через NuGet Package Manager.
Когда я смотрел исходники этой сборки, там в методах некоторых классов есть вызовы Console.WriteLine("строковое сообщение"). Как можно перехватить сообщения, отправляемые с помощью Console.WriteLine, так, чтобы я мог эти сообщения отобразить, например, в каком-нибудь TextBox моего проекта на WinForms?
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39785759
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..,

Stdin\stdout в классе Console есть TextWriter и TextReader
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39785888
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..Как можно перехватить сообщения, отправляемые с помощью Console
Console.SetOut(TextWriter) Method
Там и пример есть
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39786063
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Новичок ООП..там в методах некоторых классов есть вызовы Console.WriteLine("строковое сообщение").
Это заглушки, которые забыли выпилить из исходников
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39786084
Cat2Это заглушки, которые забыли выпилить из исходниковнет, не заглушки. Там вполне осмысленная информация передаётся, ну и отладочные сообщения.

Я понимаю, что Console.Write можно перенаправить в TextWriter но как потом из этого TextWriter извлечь строки и перекинуть их на TextBox ?
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39786085
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..,

для таких вещей есть логирование, которое можно настроить на вывода в stdout, в файл или куда угодно еще.
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39786118
Roman Mejtesкуда угодно ещемне не нужно куда угодно - мне нужно вывести текст в элемент управления "Мемо-поле" (здесь он называется TextBox)
Вы можете привести пример кода, как из TextWriter вытащить накопленный там текст в TextBox ?
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39786134
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..Roman Mejtesкуда угодно ещемне не нужно куда угодно - мне нужно вывести текст в элемент управления "Мемо-поле" (здесь он называется TextBox)
Вы можете привести пример кода, как из TextWriter вытащить накопленный там текст в TextBox ?

На форме только TextBox с именем textBox1, конечно такой вариант не очень хороший, так как я удерживаю постоянно ссылку на этот текст бокс и когда окно закроется, ссылка сохранится. Лучше сделать какую то перемычку и слабые ссылки или связывание, а текст форматировать в VM или как там у вас всё работает.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApp3
{
    internal class TextBoxWriter : TextWriter
    {
        private readonly TextBox _textBox;
        public TextBoxWriter(TextBox textBox)
        {
            _textBox = textBox;
        }

        public override Encoding Encoding => Encoding.UTF8;

        public override void WriteLine(string value)
        {
            _textBox.Text += value + Environment.NewLine;
            _textBox.Select(_textBox.Text.Length, 0);
            _textBox.ScrollToCaret();
            base.WriteLine(value);
        }
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            var myTextWriter = new TextBoxWriter(textBox1);
            Console.SetOut(myTextWriter);
            var timer = new Timer() { Interval = 500 };
            timer.Tick += Timer_Tick;
            timer.Start();
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            this.Invoke(new Action(OnWriter));
        }

        private void OnWriter()
        {
            Console.WriteLine(DateTime.UtcNow.ToString());
        }
    }
}
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39786140
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..Cat2Это заглушки, которые забыли выпилить из исходниковнет, не заглушки. Там вполне осмысленная информация передаётся, ну и отладочные сообщения.

Я понимаю, что Console.Write можно перенаправить в TextWriter но как потом из этого TextWriter извлечь строки и перекинуть их на TextBox ?

а можно еще так, не проверял, но:

пускаем приложение руками
>app >myconsole.txt

оно ставит файл на проверку на изменение, читает файл и, если изменился - текст из него выдает на контрол
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39786153
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..Привет, форумчане!
Я в своём проекте (WinForms Net Framework 4.6.2) использую стороннюю dll-сборку, установленную через NuGet Package Manager.
Когда я смотрел исходники этой сборки, там в методах некоторых классов есть вызовы Console.WriteLine("строковое сообщение"). Как можно перехватить сообщения, отправляемые с помощью Console.WriteLine, так, чтобы я мог эти сообщения отобразить, например, в каком-нибудь TextBox моего проекта на WinForms?
внести изменения в исходники
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39786171
Roman Mejtes, Спасибо за ваш код - чуть позже попробую проверить его в работе.
Кстати, будет ли он работать если в Console.Write фигачат из нескольких потоков (явно не UI-потоков) ?
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39786174
Изопропилвнести изменения в исходникив принципе это правильно, но дело вот в чём - код я взял у чувака с гитхаба - и что, если он будет вносить изменения (обновления), мне каждый раз лезть править исходники?
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39786175
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..Roman Mejtes, Спасибо за ваш код - чуть позже попробую проверить его в работе.
Кстати, будет ли он работать если в Console.Write фигачат из нескольких потоков (явно не UI-потоков) ?
сделайте Writer его потокобезопасным, обновляйте TextBox в UI потоке, добавьте StringBuilder в который вставляете новые строки, а потом этот StringBuilder выводите в TextBox. Так будет правильнее, я вам только пример кинул
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39786241
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..,

Заменить Console.WriteLine по всему проекту несложно

Хуже будет, когда чувак прикрутит человеческий логгер.
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39786303
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

А, кстати, есть альтернатива этому Console.WriteLine? Если использую что-то от слова debug - сыпет в эвентсы, а мне удобно чтоб отдельно в аутпут - пишу в консоль.
...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39786364
Roman Mejtes, Спасибо за ваш ответ, всё получилось


объявил интерфейс
Код: c#
1.
2.
3.
4.
  public interface IOutputMessage
  {
    void OutputMessage(string message);
  }


ваш класс я переделал в более абстрактный вид
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  internal class TTMyTextWriter : TextWriter
  {
    private readonly IOutputMessage outputMessageDevice;
    public TTMyTextWriter(IOutputMessage OutputMessageDevice)
    {
      outputMessageDevice = OutputMessageDevice;
    }

    public override Encoding Encoding => Encoding.UTF8;

    internal void OutputMessage(string message)
    {
      outputMessageDevice.OutputMessage(message);
      //base.WriteLine(message); // <--- No, no, no need to do that !
    }

    public override void WriteLine(string value) => OutputMessage(value);

    public override void Write(string value) => OutputMessage(value);

  }




затем реализовал интерфейс IOutputMessage в форме
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
....
    private delegate void DelegateOutputMessage(string message);

    internal TTMyTextWriter MyTextWriter = null;
....
    public void OutputMessage(string message)
    {
      InnerOutputMessage(message);
    }

    private void InnerOutputMessage(string message)
    {
      if (TxtMessage.InvokeRequired)
      {
        DelegateOutputMessage d = new DelegateOutputMessage(OutputMessage);
        TxtMessage.Invoke(d, new object[] { message });
      }
      else
      {
        TxtMessage.AppendText(message + Environment.NewLine + Environment.NewLine);
      }
    }


при загрузке формы вызывается метод
Код: c#
1.
2.
3.
4.
5.
    internal void RedirectConsoleOutput()
    {
      MyTextWriter = new TTMyTextWriter(this);
      Console.SetOut(MyTextWriter);
    }


...
Рейтинг: 0 / 0
Проект на WinForms перехватить Console.WriteLine
    #39786365
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlИзопропил,

А, кстати, есть альтернатива этому Console.WriteLine? Если использую что-то от слова debug - сыпет в эвентсы, а мне удобно чтоб отдельно в аутпут - пишу в консоль.
iskatelsqlИзопропил,

А, кстати, есть альтернатива этому Console.WriteLine? Если использую что-то от слова debug - сыпет в эвентсы, а мне удобно чтоб отдельно в аутпут - пишу в консоль.
Альтернатива - логгер, например nlog

В качестве target можно использовать в частности MethodCall, FormControl, RichTextBox или создать свой target
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проект на WinForms перехватить Console.WriteLine
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]