Лёгкое приложение для создания скриншотов в Windows: живёт в трее, захватывает экран по хоткею, даёт быстро разметить снимок и сохраняет/копирует результат.
- Захват: весь экран, активное окно (через
DWM extended frame bounds, без лишней рамки/тени), произвольная область (выделение мышью поверх снимка рабочего стола). - Скролл-скриншот: выбираете область — приложение само прокручивает её колесом мыши и склеивает кадры в одно длинное изображение.
- Редактор поверх скриншота: стрелки, текст, размытие (пикселизация) выбранной области, обрезка, undo/redo.
- Сохранение: PNG или JPG (с настраиваемым качеством), автосохранение в выбранную папку, копирование в буфер обмена.
- Глобальные хоткеи: назначаются в настройках, работают из любого приложения.
- Трей: иконка в системном трее с меню быстрых действий, без главного окна.
- История снимков: список последних N сохранённых скриншотов с превью, открытием и копированием.
Хоткеи по умолчанию: Ctrl+Alt+F — весь экран, Ctrl+Alt+A — область, Ctrl+Alt+W — активное окно,
Ctrl+Alt+S — скролл-скриншот. Меняются в Настройках.
KrinzhScreen.sln
├── src/KrinzhScreen.Core — кроссплатформенная логика (net8.0, без зависимостей от UI)
│ ├── Models — AppSettings, HotkeyBinding, HistoryItem, enum'ы
│ ├── Settings — чтение/запись settings.json
│ ├── History — чтение/запись history.json
│ ├── Naming — генерация имён файлов
│ └── Stitching — алгоритм склейки скролл-скриншота (юнит-тестируемый, без GDI+)
│
├── src/KrinzhScreen.App — Windows-приложение (net8.0-windows, WinForms)
│ ├── Native — P/Invoke (RegisterHotKey, DwmGetWindowAttribute, mouse_event)
│ ├── Capture — ScreenCapture, RegionSelectorForm, ScrollCaptureService
│ ├── Editor — EditorCanvas/EditorForm + аннотации (стрелка/текст/блюр)
│ ├── Clipboard — работа с буфером обмена
│ ├── Storage — сохранение PNG/JPG на диск
│ ├── UI — трей-меню, окно настроек, окно истории
│ ├── TrayApplicationContext — точка сборки всего вместе
│ └── Program.cs — точка входа, singleton-инстанс через Mutex
│
└── tests/KrinzhScreen.Core.Tests — xUnit-тесты для алгоритма склейки и именования файлов
Ядро (KrinzhScreen.Core) намеренно не зависит от System.Drawing/WinForms, чтобы алгоритм
склейки скролл-скриншота и работа с настройками/историей были тестируемыми без Windows-окружения.
Весь Win32/GDI+ код изолирован в KrinzhScreen.App.
Нужен Windows и .NET 8 SDK (в этой среде разработки нет ни Windows, ни .NET SDK, поэтому код не собирался и не запускался здесь — соберите и проверьте на своей машине).
dotnet build
dotnet run --project src/KrinzhScreen.App
dotnet test tests/KrinzhScreen.Core.TestsЛибо откройте KrinzhScreen.sln в Visual Studio 2022+ (workload "Разработка классических приложений
.NET").
При первом запуске приложение создаёт %AppData%\KrinzhScreen\settings.json и history.json,
папку для скриншотов по умолчанию — Изображения\KrinzhScreen.
- Скролл-скриншот — эвристический алгоритм (сравнение кадров до/после прокрутки, без доступа к внутреннему состоянию скроллящегося приложения). Хорошо работает на статичном контенте (статьи, код, переписки), может ошибаться на анимациях, ленивой подгрузке или "прилипающих" элементах.
- Клавиша Win в хоткеях не назначается через UI — WinForms ненадёжно ловит её через обычный
KeyDown. Модель это поддерживает (HotkeyBinding.Win), но выбор ограничен Ctrl/Alt/Shift. - Иконка трея рисуется в рантайме (
TrayIconFactory), а не берётся из.ico-ресурса — упрощает сборку, но не даёт кастомизировать её без правки кода. - Обрезка (Crop) в редакторе — это финальная область, применяемая при сохранении/копировании; сам холст в редакторе не меняет размер при выборе области обрезки.