Загрузка данных
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;
}
}
}
}