/
d4nil
/
Konenkov_2413_Course_Work
Обзор
Документация
Войти
/
d4nil
/
Konenkov_2413_Course_Work
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
Game3
Program (2).cs
140 строк
5 KB
Konenkov Daniel
doc: доабвлены комментарии
17 янв 2026, 22:37
17 янв 2026, 22:37
a569851
Код
Авторство
О чём код?
using System; using System.IO; using System.Runtime.InteropServices; using Microsoft.Win32.SafeHandles; namespace ConsoleApplication1 { /// <summary> /// Демонстрационная программа для вывода буфера консоли через Win32 API /// </summary> class Program { /// <summary> /// Win32 API: создает или открывает handle вывода консоли /// </summary> [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] static extern SafeFileHandle CreateFile( string parFileName, [MarshalAs(UnmanagedType.U4)] uint parFileAccess, [MarshalAs(UnmanagedType.U4)] uint parFileShare, IntPtr parSecurityAttributes, [MarshalAs(UnmanagedType.U4)] FileMode parCreationDisposition, [MarshalAs(UnmanagedType.U4)] int parFlags, IntPtr parTemplate); /// <summary> /// Win32 API: записывает буфер в консоль /// </summary> [DllImport("kernel32.dll", SetLastError = true)] static extern bool WriteConsoleOutput( SafeFileHandle parHConsoleOutput, CharInfo[] parLpBuffer, Coord parDwBufferSize, Coord parDwBufferCoord, ref SmallRect refLpWriteRegion); /// <summary> /// Структура координат для Win32 API консоли /// </summary> [StructLayout(LayoutKind.Sequential)] public struct Coord { /// <summary>Координата X</summary> public short _x; /// <summary>Координата Y</summary> public short _y; /// <summary> /// Инициализирует координаты /// </summary> /// <param name="parX">Координата X</param> /// <param name="parY">Координата Y</param> public Coord(short parX, short parY) { _x = parX; _y = parY; } }; /// <summary> /// Объединение для символов Unicode или ASCII /// </summary> [StructLayout(LayoutKind.Explicit)] public struct CharUnion { /// <summary>Символ Unicode</summary> [FieldOffset(0)] public char _unicodeChar; /// <summary>Символ ASCII</summary> [FieldOffset(0)] public byte _asciiChar; } /// <summary> /// Информация о символе с атрибутами для буфера консоли Win32 /// </summary> [StructLayout(LayoutKind.Explicit)] public struct CharInfo { /// <summary>Данные символа</summary> [FieldOffset(0)] public CharUnion _char; /// <summary>Цветовые атрибуты</summary> [FieldOffset(2)] public short _attributes; } /// <summary> /// Прямоугольная область для буферов консоли Win32 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct SmallRect { /// <summary>Левая граница</summary> public short _left; /// <summary>Верхняя граница</summary> public short _top; /// <summary>Правая граница</summary> public short _right; /// <summary>Нижняя граница</summary> public short _bottom; } /// <summary> /// Точка входа демонстрационной программы /// </summary> /// <param name="parArgs">Аргументы командной строки</param> [STAThread] static void Main(string[] parArgs) { SafeFileHandle h = CreateFile("CONOUT$", 0x40000000, 2, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero); if (!h.IsInvalid) { CharInfo[] buf = new CharInfo[80 * 25]; SmallRect rect = new SmallRect() { _left = 0, _top = 0, _right = 80, _bottom = 25 }; // Пример диапазона латинских букв A-Z for ( byte character = 160; character < 240; ++character ) { for (short attribute = 0; attribute < 15; ++attribute) { for (int i = 0; i < buf.Length; ++i) { buf[i]._attributes = attribute; buf[i]._char._asciiChar = character; } bool b = WriteConsoleOutput(h, buf, new Coord() { _x = 80, _y = 25 }, new Coord() { _x = 0, _y = 0 }, ref rect); System.Threading.Thread.Sleep( 100 ); } } } Console.ReadKey(); } } }