Реализация DI в PHP
Jason-Webb 13.05.2025
Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . .
Обработка изображений в реальном времени на C# с OpenCV
stackOverflow 13.05.2025
Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . .
POCO, ACE, Loki и другие продвинутые C++ библиотеки
NullReferenced 13.05.2025
В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . .
Паттерны проектирования GoF на C#
UnmanagedCoder 13.05.2025
Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . .
Создаем CLI приложение на Python с Prompt Toolkit
py-thonny 13.05.2025
Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . .
Конвейеры ETL с Apache Airflow и Python
AI_Generated 13.05.2025
ETL-конвейеры – это набор процессов, отвечающих за извлечение данных из различных источников (Extract), их преобразование в нужный формат (Transform) и загрузку в целевое хранилище (Load). . . .
Выполнение асинхронных задач в Python с asyncio
py-thonny 12.05.2025
Современный мир программирования похож на оживлённый мегаполис – тысячи процессов одновременно требуют внимания, ресурсов и времени. В этих джунглях операций возникают ситуации, когда программа. . .
Работа с gRPC сервисами на C#
UnmanagedCoder 12.05.2025
gRPC (Google Remote Procedure Call) — открытый высокопроизводительный RPC-фреймворк, изначально разработанный компанией Google. Он отличается от традиционых REST-сервисов как минимум тем, что. . .
CQRS (Command Query Responsibility Segregation) на Java
Javaican 12.05.2025
CQRS — Command Query Responsibility Segregation, или разделение ответственности команд и запросов. Суть этого архитектурного паттерна проста: операции чтения данных (запросы) отделяются от операций. . .
Шаблоны и приёмы реализации DDD на C#
stackOverflow 12.05.2025
Когда я впервые погрузился в мир Domain-Driven Design, мне показалось, что это очередная модная методология, которая скоро канет в лету. Однако годы практики убедили меня в обратном. DDD — не просто. . .
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 = true’ & ‘fritur = false’, в данной настройке у нас программа работает только на отлов файлов с фильтром «sb*.*». Параметр ‘Number block = #’ отображает количество блоков заказов которые будут отображаться в программе. Параметр ‘path folder = $B:\sb’дает наше программе понять, в какую папку посылать FileSystemWatcher для слежения. Следующий Параметр ‘Debug Console status :Disabled’ он уже отвечает за нашу консоль, в данном примере консоль отключена. Теперь рассмотрим как связать этот параметр с нашей программой. 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 [System.Runtime.InteropServices.DllImportAttribute(«kernel32.dll», EntryPoint = «GetStdHandle»)] [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# | Просмотров: 2773 | |
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(); } }
Вопросом таким я озадачился, читая ВиО. Поискал по интернету и нашёл 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"); }
См. также