Windows forms c console

Главная » 2016 » Июль » 7 » Урок №7 — Console в проекте Windows Forms


08:48

Урок №7 — Console в проекте Windows Forms

Доброго времени суток мои читатели! Сегодня мы поговорим о том, как добавить консоль параллельно с нашим проектом Windows Forms на языке C#.

Иногда появляется такая нужда, чтобы в проекте Windows Forms присутствовала консоль (к примеру для банального Debug’a), и у меня она появилась. Речь пойдет всё о том же FileSystemWatcher и консоли. В процессе написания программы на этапе сращивания с 1С я встретился с одной не маловажной проблемой, файлы, которые поступали из 1С не попадали в мою программу, у меня сразу встал вопрос в чём же дело!? После некоторых манипуляций я просто написал на C# в консольном проекте моего FileSystemWatcher и тут я понял в чем была моя ошибка. Наша 1С создает некий файл с расширением .tmp, а фильтр программы отслеживал только файлы расширения .sav, через секунду .tmp файл становился .sav файлом. Мой самый первый FileSystemWatcher в консольном режиме отслеживал изменения OnChanged с фильтром «*.sav», после того, как я установил фильтр следующего типа «*.*» я получал сообщения о событии OnChanged со следующим текстом : «Файл : neworder.tmp создан», то есть получается, что файловая система отслеживала файл .tmp, но папка не показывала мне этого файла и в конечном варианте мы видели уже файл .sav я понял, что файловая система следом за событием OnChanged она делает OnRenamed и переименовывает .tmp файл в .sav.

Далее я добавил функцию OnRenamed и она действительно регистрировала переименование файла. В тот момент, я решил, что хорошо было бы иметь консоль в моем приложении чтобы смотреть, какие события она логирует. Итак, в нашем приложении мы имеем файл с настройками в него я прописал также и консоль, чтобы её можно было отключить в случае не надобности или боевого запуска на системе.
Файл с настройками имеет следующий вид :

User’s settings
Sborka Screen ver 1.0
by ZombieVDK
path folder = 
$B:\sb
sborka = true
fritur = false
Number block = 8
Debug Console status :Disabled

Что же отображается в этом файле? Всё что нужно моей программе. В нашей рознице существуют два типа продукции :

  • Сборка
  • Фритюр

За эти элементы отвечают соответствующие строчки ‘sborka = true’ & ‘fritur = false’, в данной настройке у нас программа работает только на отлов файлов с фильтром «sb*.*». Параметр ‘Number block = #’ отображает количество блоков заказов которые будут отображаться в программе. Параметр ‘path folder = $B:\sb’дает наше программе понять, в какую папку посылать FileSystemWatcher для слежения. Следующий Параметр ‘Debug Console status :Disabled’ он уже отвечает за нашу консоль, в данном примере консоль отключена. Теперь рассмотрим как связать этот параметр с нашей программой.
Для того, чтобы считать параметры файла мы напишем функцию preloader, которая будет прогружать настройки, в этой статье не буду расписывать как это сделать, данный пример мы уже реализовывали в нашем
уроке №6 по FileSystemWatcher 
После того, как функция settings (которая создает наш файл с настройками) и функция preloader (которая загружает эти настройки) написаны, мы переходим к основному, написание кода для работы с консолью в Windows Forms проекте. С самого начала создаем функцию, я назвал её consondeb и прописываем вот такой код :

 

 public void consondeb()

        {

            if (NativeMethods.AllocConsole())

            {

IntPtr stdHandle = NativeMethods.GetStdHandle(NativeMethods.STD_OUTPUT_HANDLE);

Console.WriteLine(«sbscreen.exe — Debug Console v0.01 — ZombieVDK»);

Console.WriteLine(«Debug Console будет следить за папкой в режиме Debug для отслеживание событий : \r\nOnChanged\r\nOnRenamed\r\nOnDelete\r\nAnother»);

Console.WriteLine(«Для деактивации консоли перейдите в настройки и произведите отключение.»);

Console.WriteLine(«Параметры программы : \r\nПуть = » + pathme + «\r\nСтатус Фритюра = » + fwatch +»\r\nСтатус сборки = » + watch);

            }

            else

                Console.WriteLine(«Консоль Активна!»);

        }

После того, как мы создали эту функцию, Надо ещё прописать класс NativeMethods :

public partial class NativeMethods
        {
            public static Int32 STD_OUTPUT_HANDLE = -11;

            [System.Runtime.InteropServices.DllImportAttribute(«kernel32.dll», EntryPoint = «GetStdHandle»)]
            public static extern System.IntPtr GetStdHandle(Int32 nStdHandle);

            [System.Runtime.InteropServices.DllImportAttribute(«kernel32.dll», EntryPoint = «AllocConsole»)]

[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]

            public static extern bool AllocConsole();
        }

На этом все, теперь в нашем проекте будет запускаться консоль параллельно с Windows Forms! Вот наш результат:

На этом наш урок закончен! До новых встреч! :)

Категория: Уроки по C# |
Просмотров: 2758 |

Вопросом таким я озадачился, читая ВиО. Поискал по интернету и нашёл solution здесь.

Для тестирования создал пустой проект Windows Forms C#. Добавал класс:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

    class Win32
    {
        /// <summary>
        /// Allocates a new console for current process.
        /// </summary>
        [DllImport("kernel32.dll")]
        public static extern Boolean AllocConsole();

        /// <summary>
        /// Frees the console.
        /// </summary>
        [DllImport("kernel32.dll")]
        public static extern Boolean FreeConsole();
    }

В конструктор формы добавил:

        public Form1()
        {
            InitializeComponent();

            Win32.AllocConsole();
            Console.WriteLine("Hello world\n");
        }

См. также

  • http://stackoverflow.com/questions/472282/show-console-in-windows-application
  • http://reg2run.svn.sourceforge.net/viewvc/reg2run/trunk/ManualConsole.cs?view=markup
  • http://www.nerdyhearn.com/blog/157
  • Распознавание голоса и речи на C#

    UnmanagedCoder 05.05.2025

    Интеграция голосового управления в приложения на C# стала намного доступнее благодаря развитию специализированных библиотек и API. При этом многие разработчики до сих пор считают голосовое управление. . .

    Реализация своих итераторов в C++

    NullReferenced 05.05.2025

    Итераторы в C++ — это абстракция, которая связывает весь экосистему Стандартной Библиотеки Шаблонов (STL) в единое целое, позволяя алгоритмам работать с разнородными структурами данных без знания их. . .

    Разработка собственного фреймворка для тестирования в C#

    UnmanagedCoder 04.05.2025

    C# довольно богат готовыми решениями – NUnit, xUnit, MSTest уже давно стали своеобразными динозаврами индустрии. Однако, как и любой динозавр, они не всегда могут протиснуться в узкие коридоры. . .

    Распределенная трассировка в Java с помощью OpenTelemetry

    Javaican 04.05.2025

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

    Шаблоны обнаружения сервисов в Kubernetes

    Mr. Docker 04.05.2025

    Современные Kubernetes-инфраструктуры сталкиваются с серьёзными вызовами. Развертывание в нескольких регионах и облаках одновременно, необходимость обеспечения низкой задержки для глобально. . .

    Создаем SPA на C# и Blazor

    stackOverflow 04.05.2025

    Мир веб-разработки за последние десять лет претерпел коллосальные изменения. Переход от традиционных многостраничных сайтов к одностраничным приложениям (Single Page Applications, SPA) — это. . .

    Реализация шаблонов проектирования GoF на C++

    NullReferenced 04.05.2025

    «Банда четырёх» (Gang of Four или GoF) — Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес — в 1994 году сформировали канон шаблонов, который выдержал проверку временем. И хотя C++ претерпел. . .

    C# и сети: Сокеты, gRPC и SignalR

    UnmanagedCoder 04.05.2025

    Сетевые технологии не стоят на месте, а вместе с ними эволюционируют и инструменты разработки. В . NET появилось множество решений — от низкоуровневых сокетов, позволяющих управлять каждым байтом. . .

    Создание микросервисов с Domain-Driven Design

    ArchitectMsa 04.05.2025

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

    Многопоточность в C++: Современные техники C++26

    bytestream 04.05.2025

    C++ долго жил по принципу «один поток — одна задача» — как старательный солдатик, выполняющий команды одну за другой. В то время, когда процессоры уже обзавелись несколькими ядрами, этот подход стал. . .

    Jun 04

    You may wish to enable your WinForms application to run from a console window or command line. And when it does, you probably want to send output messages to the console window that launched your WinForms application.

    Unfortunately Console.WriteLine()–the standard method of writing to the console window–by default will not work from a WinForms application. That’s because the console window that launched your WinForms application belongs to the cmd.exe process, which is separate from your WinForms application process.

    So to redirect output from a WinForms application to the console window that launched it, use the AttachConsole Win32 method introduced in Windows XP. AttachConsole attaches the current process to the console window of another process. The special parameter ATTACH_PARENT_PROCESS attaches to the parent process, which in this case is the console window that launched the WinForms application.

    Simple Example

    Following is a simple WinForms application that redirects its output to the console window that launched it:

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace MyWinFormsApp
    {
        static class Program
        {
            [DllImport( "kernel32.dll" )]
            static extern bool AttachConsole( int dwProcessId );
            private const int ATTACH_PARENT_PROCESS = -1;
    
            [STAThread]
            static void Main( string[] args )
            {
                // redirect console output to parent process;
                // must be before any calls to Console.WriteLine()
                AttachConsole( ATTACH_PARENT_PROCESS );
    
                // to demonstrate where the console output is going
                int argCount = args == null ? 0 : args.Length;
                Console.WriteLine( "nYou specified {0} arguments:", argCount );
                for (int i = 0; i < argCount; i++)
                {
                    Console.WriteLine( "  {0}", args[i] );
                }
    
                // launch the WinForms application like normal
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault( false );
                Application.Run( new Form1() );
            }
        }
    }

    One Gotcha

    There is one problem with this approach. If you redirect the console window output to a text file, for example using the redirect arrow:

    MyWinFormsApp.exe >output.txt arg1 arg2

    In this case, output will not redirect to the “output.txt” text file as expected, but instead will continue to appear in the console window. Please comment if you have a solution to this issue.

    CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

    Often, you need a console window together with a WinForm application. It can be very handy for debugging purposes while developping, but also for a (temporary) logging of some data. It is very simple to do. The following program demonstrates it, using P/Invoke.

    Start a new Windows application, drop a CheckBox on the form, name it ViewConsole, and copy the following code into it.

    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;    // needed to call external
                                             // application (winAPI dll)
    
    namespace WindowsApplication1
    {
       partial class Form1: Form
       {
          public Form1()
          {
             InitializeComponent();
          }
    
          private void ViewConsole_CheckedChanged(object sender,
                                                  EventArgs e)
          {
             if (ViewConsole.Checked)
                Win32.AllocConsole();
             else
                Win32.FreeConsole();
          }
       }
    
       public class Win32
       {
          [DllImport("kernel32.dll")]
          public static extern Boolean AllocConsole();
          [DllImport("kernel32.dll")]
          public static extern Boolean FreeConsole();
       }
    }
    

    Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии
  • Windows server 2019 ltsc torrent
  • Правильная настройка микрофона в windows
  • Unicows dll windows 98
  • Как сделать корзину невидимой на рабочем столе windows 11
  • Windows 10 realtek audio console настройка