Загрузка данных


using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowManager
{
    public partial class Form1 : Form
    {
        // ====================== WINAPI ======================
        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll")]
        private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

        [DllImport("user32.dll")]
        private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

        [DllImport("user32.dll")]
        private static extern bool IsWindow(IntPtr hWnd);

        [DllImport("user32.dll")]
        private static extern int GetWindowText(IntPtr hWnd, System.Text.StringBuilder lpString, int nMaxCount);

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        [DllImport("user32.dll")]
        private static extern bool CloseWindow(IntPtr hWnd);

        private const uint SWP_NOMOVE = 0x0002;
        private const uint SWP_NOZORDER = 0x0004;
        private const uint SWP_NOACTIVATE = 0x0010;
        private const uint SWP_FRAMECHANGED = 0x0020;

        private struct RECT { public int Left, Top, Right, Bottom; }

        // ====================== ПЕРЕМЕННЫЕ ======================
        private Dictionary<IntPtr, RECT> originalSizes = new Dictionary<IntPtr, RECT>();
        private bool isDragging = false;
        private Point dragStartPoint = Point.Empty;

        // ====================== ЭЛЕМЕНТЫ УПРАВЛЕНИЯ ======================
        private Button btnMinimize;
        private Button btnMaximize;
        private Button btnIncrease;
        private Button btnDecrease;
        private Button btnRestore;
        private Label lblStatus;

        // ====================== КОНСТРУКТОР ======================
        public Form1()
        {
            // Настройки формы (маленькая, поверх всех)
            this.Text = "Управление";
            this.Size = new Size(300, 50);
            this.FormBorderStyle = FormBorderStyle.None;
            this.StartPosition = FormStartPosition.CenterScreen;
            this.TopMost = true;
            this.BackColor = Color.FromArgb(30, 30, 30);
            this.Opacity = 0.9;
            this.ShowInTaskbar = false;

            // Позволяем перетаскивать форму
            this.MouseDown += Form1_MouseDown;
            this.MouseMove += Form1_MouseMove;
            this.MouseUp += Form1_MouseUp;

            // Создаём кнопки с иконками
            btnMinimize = CreateButton("➖", 10, 10, 40, 30, Color.Yellow);
            btnMinimize.Click += (s, e) => MinimizeWindow();

            btnMaximize = CreateButton("☐", 55, 10, 40, 30, Color.Lime);
            btnMaximize.Click += (s, e) => MaximizeWindow();

            btnIncrease = CreateButton("➕", 100, 10, 40, 30, Color.Cyan);
            btnIncrease.Click += (s, e) => ResizeWindow(1.1f);

            btnDecrease = CreateButton("➖", 145, 10, 40, 30, Color.Orange);
            btnDecrease.Click += (s, e) => ResizeWindow(0.9f);

            btnRestore = CreateButton("↺", 190, 10, 40, 30, Color.Magenta);
            btnRestore.Click += (s, e) => RestoreWindow();

            // Статусная строка (показывает активное окно)
            lblStatus = new Label();
            lblStatus.Text = "Активное окно: ...";
            lblStatus.Font = new Font("Segoe UI", 8);
            lblStatus.ForeColor = Color.Gray;
            lblStatus.Location = new Point(240, 15);
            lblStatus.AutoSize = true;
            this.Controls.Add(lblStatus);

            // Таймер для обновления статуса
            Timer statusTimer = new Timer();
            statusTimer.Interval = 500;
            statusTimer.Tick += (s, e) => UpdateStatus();
            statusTimer.Start();
        }

        // ====================== ВСПОМОГАТЕЛЬНЫЕ МЕТОДЫ ======================
        private Button CreateButton(string text, int x, int y, int w, int h, Color color)
        {
            Button btn = new Button();
            btn.Text = text;
            btn.Font = new Font("Segoe UI", 12, FontStyle.Bold);
            btn.ForeColor = color;
            btn.BackColor = Color.FromArgb(40, 40, 40);
            btn.FlatStyle = FlatStyle.Flat;
            btn.FlatAppearance.BorderColor = color;
            btn.FlatAppearance.BorderSize = 1;
            btn.Size = new Size(w, h);
            btn.Location = new Point(x, y);
            this.Controls.Add(btn);
            return btn;
        }

        // ====================== ПЕРЕТАСКИВАНИЕ ОКНА ======================
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                isDragging = true;
                dragStartPoint = new Point(e.X, e.Y);
            }
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isDragging)
            {
                Point newLocation = this.Location;
                newLocation.X += e.X - dragStartPoint.X;
                newLocation.Y += e.Y - dragStartPoint.Y;
                this.Location = newLocation;
            }
        }

        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            isDragging = false;
        }

        // ====================== ФУНКЦИИ УПРАВЛЕНИЯ ОКНАМИ ======================

        private IntPtr GetActiveWindow()
        {
            IntPtr hWnd = GetForegroundWindow();
            if (hWnd == IntPtr.Zero || hWnd == this.Handle)
                return IntPtr.Zero;
            return hWnd;
        }

        private void MinimizeWindow()
        {
            IntPtr hWnd = GetActiveWindow();
            if (hWnd == IntPtr.Zero) return;
            ShowWindow(hWnd, 6); // SW_MINIMIZE
            lblStatus.Text = "Окно свёрнуто";
            lblStatus.ForeColor = Color.Yellow;
        }

        private void MaximizeWindow()
        {
            IntPtr hWnd = GetActiveWindow();
            if (hWnd == IntPtr.Zero) return;
            Rectangle screen = Screen.PrimaryScreen.Bounds;
            // Сохраняем оригинальный размер
            if (!originalSizes.ContainsKey(hWnd))
            {
                RECT rect;
                if (GetWindowRect(hWnd, out rect))
                    originalSizes[hWnd] = rect;
            }
            // Разворачиваем на весь экран (без рамок)
            SetWindowPos(hWnd, IntPtr.Zero, 0, 0, screen.Width, screen.Height,
                SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
            lblStatus.Text = "На весь экран";
            lblStatus.ForeColor = Color.Lime;
        }

        private void ResizeWindow(float factor)
        {
            IntPtr hWnd = GetActiveWindow();
            if (hWnd == IntPtr.Zero) return;
            RECT rect;
            if (!GetWindowRect(hWnd, out rect)) return;
            int w = (int)((rect.Right - rect.Left) * factor);
            int h = (int)((rect.Bottom - rect.Top) * factor);
            // Не даём стать меньше 100×100 (чтобы видно было)
            if (w < 100) w = 100;
            if (h < 100) h = 100;
            // Сохраняем оригинал, если ещё не сохранён
            if (!originalSizes.ContainsKey(hWnd))
                originalSizes[hWnd] = rect;
            SetWindowPos(hWnd, IntPtr.Zero, 0, 0, w, h,
                SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
            lblStatus.Text = $"Размер: {w}×{h}";
            lblStatus.ForeColor = Color.Cyan;
        }

        private void RestoreWindow()
        {
            IntPtr hWnd = GetActiveWindow();
            if (hWnd == IntPtr.Zero) return;
            if (originalSizes.ContainsKey(hWnd))
            {
                RECT rect = originalSizes[hWnd];
                SetWindowPos(hWnd, IntPtr.Zero, rect.Left, rect.Top,
                    rect.Right - rect.Left, rect.Bottom - rect.Top,
                    SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
                lblStatus.Text = "Восстановлено";
                lblStatus.ForeColor = Color.Magenta;
                originalSizes.Remove(hWnd);
            }
            else
            {
                lblStatus.Text = "Нет сохранённого размера";
                lblStatus.ForeColor = Color.Orange;
            }
        }

        private void UpdateStatus()
        {
            IntPtr hWnd = GetActiveWindow();
            if (hWnd == IntPtr.Zero || hWnd == this.Handle)
            {
                lblStatus.Text = "Активное окно: нет";
                lblStatus.ForeColor = Color.Gray;
                return;
            }
            System.Text.StringBuilder sb = new System.Text.StringBuilder(256);
            GetWindowText(hWnd, sb, 256);
            string title = sb.ToString();
            if (!string.IsNullOrEmpty(title))
            {
                lblStatus.Text = $"Окно: {title}";
                lblStatus.ForeColor = Color.White;
            }
        }
    }
}