Реализация 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# | Просмотров: 2790 | |
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");
}
См. также
