# TrayIconGuard v8 «Aurora» 🛡️✨

[![Версия](https://img.shields.io/badge/версия-8.6.3-green)](https://github.com/paulmann/windows-show-all-tray-icons/releases/latest)
[![Лицензия](https://img.shields.io/badge/лицензия-PolyForm%20Noncommercial%201.0.0-orange)](LICENSE)
[![Native C++17](https://img.shields.io/badge/native-C%2B%2B17-00599C?logo=cplusplus&logoColor=white)](https://en.cppreference.com/w/)
[![Без зависимостей](https://img.shields.io/badge/зависимости-НОЛЬ-brightgreen)](docs/BUILD.md)
[![Размер exe](https://img.shields.io/badge/exe-~1.05%20MB-blue)](https://github.com/paulmann/windows-show-all-tray-icons/releases/latest)
[![Windows](https://img.shields.io/badge/Windows-10%20%7C%2011-0078D6?logo=windows&logoColor=white)](https://www.microsoft.com/windows/)
[![CI](https://github.com/paulmann/windows-show-all-tray-icons/actions/workflows/ci.yml/badge.svg)](https://github.com/paulmann/windows-show-all-tray-icons/actions/workflows/ci.yml)
[![Downloads](https://img.shields.io/github/downloads/paulmann/windows-show-all-tray-icons/total?logo=github&color=blue)](https://github.com/paulmann/windows-show-all-tray-icons/releases)
[![Stars](https://img.shields.io/github/stars/paulmann/windows-show-all-tray-icons?logo=github&color=yellow)](https://github.com/paulmann/windows-show-all-tray-icons/stargazers)
📚 [Documentation site](https://paulmann.github.io/windows-show-all-tray-icons/) · [Knowledge base](https://github.com/paulmann/windows-show-all-tray-icons/wiki) · [docs/](docs/)

> **Держит все значки области уведомлений (трея) видимыми на Windows 10/11 — и удерживает их
> такими. Один нативный исполняемый файл, ноль зависимостей, ноль телеметрии.**

**На других языках:** [English](README.md) · Русский · [Deutsch](README.de.md) · [中文](README.zh.md) · [Español](README.es.md) · [हिन्दी](README.hi.md)

TrayIconGuard возвращает на панель задач значки, которые Windows прячет в выпадающий список
переполнения, — а **событийный guard** возвращает их снова в тот момент, когда Explorer опять
их скрывает (запуск приложения, обновление, перерегистрация). Программа пишет в то же самое
хранилище реестра, которое использует переключатель «Параметров» Windows, — для текущего
пользователя, без прав администратора, — и поставляет современный Fluent-интерфейс, headless-
режим наблюдателя и полноценный CLI в **одном статически слинкованном exe ~1 МБ**, который
работает на стоковой Windows.

![Дашборд светлый и тёмный, все страницы](shots/preview-2x2.png)

---

## 📋 Оглавление

- [🚀 Зачем TrayIconGuard?](#-зачем-trayiconguard)
- [✨ Ключевые возможности](#-ключевые-возможности)
- [⚡ Быстрый старт](#-быстрый-старт)
- [📦 Варианты установки](#-варианты-установки)
- [🖥️ Обзор интерфейса](#-обзор-интерфейса)
- [🧰 Справка по CLI](#-справка-по-cli)
- [🏗️ Как это работает](#-как-это-работает)
- [🔄 Самообновление через Git](#-самообновление-через-git)
- [🌍 Языки](#-языки)
- [🌗 Темы и оформление](#-темы-и-оформление)
- [🏢 Развёртывание и автоматизация](#-развёртывание-и-автоматизация)
- [🔍 Устранение неполадок](#-устранение-неполадок)
- [🛠️ Сборка из исходников](#-сборка-из-исходников)
- [🗂️ Карта репозитория](#-карта-репозитория)
- [🤝 Участие](#-участие)
- [📄 Лицензия](#-лицензия)
- [👨‍ Автор и поддержка](#-автор-и-поддержка)
- [🎯 Дорожная карта](#-дорожная-карта)

---

## 🚀 Зачем TrayIconGuard?

Windows запоминает видимость значков трея для каждого значка — и **постоянно забывает**:
каждый раз, когда приложение (пере)регистрирует свой значок уведомления, Explorer пересоздаёт
ключ реестра с `IsPromoted=0`, и значки снова проваливаются в выпадающий список `^`.
Поэтому разовые правки и `.reg`-файлы «распадаются» за считанные часы.

```text
# Что реально происходит на стоковой Windows 10/11
Приложение запустилось / обновилось / перерегистрировало значок
        │
        ▼
Explorer пересоздаёт HKCU\Control Panel\NotifyIconSettings\{id}
с IsPromoted = 0            ← значок только что скрылся
        │
        ▼
Наблюдатель TrayIconGuard (RegNotifyChangeKeyValue, дебаунс ~400 мс)
        │
        ▼
IsPromoted = 1 восстановлен ← значок мгновенно вернулся на панель
```

### Реальная польза

- **⚡ Мгновенно**: событийная модель, а не поллинг — правка применяется меньше чем за полсекунды
- **🎯 Точно**: управление каждым значком, исключения, перетаскивание для порядка, три режима видимости
- **🛡️ Уважительно**: только HKCU, обычный пользователь, никогда не админ, без телеметрии, автозагрузка по желанию
- **📦 Компактно**: один статический exe (~1,05 МБ) — без .NET, рантаймов и редистрибутивов
- **🔁 Самовосстановление**: переживает перезапуски Explorer, обновления приложений и циклы входа в систему

## ✨ Ключевые возможности

### 🛡️ **Корректность и безопасность**

- **Механика уровня «Параметров»** — пишет `IsPromoted` в `HKCU\Control Panel\NotifyIconSettings`,
  то же хранилище, что использует переключатель Windows (см. [docs/HOW-IT-WORKS.md](docs/HOW-IT-WORKS.md))
- **JSON-снимки** (схема v8) с автобэкапом перед разрушительными операциями,
  менеджер restore/export/delete, хранение 30 снимков
- **Мягкая деградация** на старых сборках: понятный статус, легаси-фолбэки, без падений
- **Стабильные коды возврата** (`0/1/2/3`) для скриптов и RMM

### 🎯 **Умный движок guard**

- **Событийный наблюдатель**: `RegNotifyChangeKeyValue` по поддереву хранилища + дебаунс,
  опциональный поллинг-фолбэк, обнаружение новых значков, пауза/продолжить
- **Режимы видимости**: *Полный* (показаны все), *Кастомный* (ваш выбор по значкам),
  *Компактный* (скрыть всё, кроме TrayIconGuard) — из меню трея или CLI
- **Управление каждым значком**: показать/скрыть/исключить, маски исключений (`onedrive.exe`, `*teams*`)
- **Перетаскивание** значков для порядка показа, сохраняется на этом ПК
- **Безопасный перезапуск Explorer** с кулдауном и подтверждением

### 🎨 **Современный Fluent UI (2026)**

- Собственная отрисовка Win32/GDI+: nav-rail, карточки, анимированные тумблеры, сегмент-контролы,
  оверлей-скроллбары, Per-Monitor-V2 DPI, скругления и тёмный тайтл-бар Windows 11
- Темы **Светлая / Тёмная / Системная** с быстрым переключателем, сохранением и автоопределением
- **Акцентный цвет**: за Windows или 8 пресетов
- Адаптивная компоновка (nav-rail сворачивается уже 860 px), полная клавиатурная навигация

### 📦 **Встроенный установщик**

- Визард первого запуска: **область** (*Только для меня* / *Для всех пользователей* — один запрос
  UAC), папка установки, автозагрузка, ярлыки на рабочем столе и в меню «Пуск» — или
  *запустить один раз* (portable)
- Запись в «Приложения и возможности»; `--uninstall` удаляет всё (сам запрашивает elevation, если нужно)

### 🔄 **Самообновление через Git**

- Opt-in проверка `update/stable.json` в этом репозитории, скачивание с **SHA-256-пином**,
  самозамена и перезапуск; ручная кнопка + опциональная автопроверка раз в сутки (только balloon)
- Контракт публикации для релиз-инженеров: [Updater_SKILL.MD](Updater_SKILL.MD)

## ⚡ Быстрый старт

```text
# 1. Скачайте свежий релиз (exe или zip)
https://github.com/paulmann/windows-show-all-tray-icons/releases/latest

# 2. Разблокируйте (Mark-of-the-Web) и запустите — это вся установка
ПКМ по TrayIconGuard.exe → Свойства → Разблокировать → OK
TrayIconGuard.exe

# 3. Первый запуск: визард спросит область / папку / ярлыки
#    …или выберите «Просто запустить один раз» (portable)
```

Headless / однострочники:

```powershell
TrayIconGuard.exe --promote-all          # показать всё сейчас и выйти
TrayIconGuard.exe --watch                # headless-guard (без GUI), напр. из Task Scheduler
TrayIconGuard.exe --status --json        # машиночитаемое состояние для мониторинга
TrayIconGuard.exe --check-update         # спросить git-фид, есть ли новая версия
```

## 📦 Варианты установки

| Режим | Как | Админ? | Что получаете |
|---|---|---|---|
| **Portable** | запустить exe где угодно | ❌ | ничего, кроме настроек в `%APPDATA%` |
| **Для пользователя** (по умолч.) | визард → *Только для меня* | ❌ | `%LOCALAPPDATA%\Programs\TrayIconGuard`, автозагрузка HKCU Run, пользовательские ярлыки, запись в «Приложения и возможности» |
| **Для всех пользователей** | визард → *Для всех пользователей* | ✅ один раз (UAC) | `%ProgramFiles%\TrayIconGuard`, автозагрузка HKLM Run, общие ярлыки Desktop/Start-Menu, машинная запись удаления |

Удаление: *Приложения и возможности → TrayIconGuard* или `TrayIconGuard.exe --uninstall`.

![Визард установки](shots/setup-wizard-light.png)

## 🖥️ Обзор интерфейса

| Страница | Что делает |
|---|---|
| **Дашборд** | живые счётчики (зарегистрировано / на панели / скрыто / исключено), состояние guard, действия в один клик, карточки системы и последних событий |
| **Значки трея** | поиск, фильтры, тумблеры по значкам, исключения, перетаскивание, контекстное меню строки |
| **Guard** | настройка наблюдателя (дебаунс, поллинг, политика перезапуска Explorer), легаси-ремонт, статистика, исключения |
| **Оформление** | тема (Светлая/Тёмная/Системная), акцент, язык, анимации, компактные строки |
| **Бэкапы** | список снимков, создать/восстановить/экспорт/удалить, тумблер автобэкапа |
| **Активность** | просмотрщик логов с фильтром уровней, экспорт, открыть папку |
| **О программе** | версия, панель обновлений, кнопки «Лицензия» и «База знаний», копия диагностики, чип режима установки |

Тёмная тема, страница «О программе» с панелью обновлений и ссылками:

![О программе, тёмная](shots/dark-about.png)

## 🧰 Справка по CLI

| Команда | Действие |
|---|---|
| *(без аргументов)* | запустить tray-резидентный GUI |
| `--minimized` | старт скрытым в области уведомлений |
| `--show` / `--toggle-guard` | IPC работающему экземпляру (показать / пауза-продолжить) |
| `--status [--json]` | напечатать состояние трея и выйти |
| `--promote-all` | показать все скрытые значки и выйти |
| `--restore-defaults` | удалить значения `IsPromoted` (вернуть управление Windows) |
| `--restart-explorer` | безопасный перезапуск оболочки и выход |
| `--backup` / `--restore-latest` | создать / восстановить JSON-снимок |
| `--watch` | headless-цикл guard (событийный наблюдатель, без GUI) |
| `--install-autostart` / `--uninstall-autostart` | управление записью HKCU Run |
| `--install-machine <dir> [--autostart] [--desktop] [--menu]` | тело установки для всех пользователей (требует elevation) |
| `--uninstall` | убрать ярлыки, автозагрузку и установленную копию (сам elevates для machine) |
| `--mode full\|custom\|compact` | режим видимости трея |
| `--check-update` / `--update-now` | проверка обновления по git-фиду / необновляющее обновление |
| `--version` / `--help` | интроспекция |

**Коды возврата:** `0` ok · `1` неверные аргументы · `2` ОС не поддерживается · `3` частичный отказ.

## 🏗️ Как это работает

Основное хранилище (Windows 10 1703+ / 11), на пользователя, без админа:

```text
HKCU\Control Panel\NotifyIconSettings\{<icon-id>}
    IsPromoted            DWORD      1 = на панели, 0 = в выпадающем списке
    ExecutablePath       REG_SZ     процесс-владелец
    IconResource         REG_SZ     путь,-id
    IconSnapshot         REG_BINARY кэш образа
    LastNotificationAddedTime  REG_QWORD
```

Легаси-«подтяжки» (опционально): `EnableAutoTray=0` и удаление политик `HideSCA*` в
`HKCU\…\Policies\Explorer`. Полное исследование, анализ «распада» и список
«не трогать» (`StuckRects3` и др.): [docs/HOW-IT-WORKS.md](docs/HOW-IT-WORKS.md).

## 🔄 Самообновление через Git

- Фид: [`update/stable.json`](update/stable.json) в `main` (схема, sha256-пины, примечания)
- Клиент: скачивание WinHTTP → проверка BCrypt SHA-256 → самозамена rename-chain → перезапуск
- Никогда не тихо: диалог подтверждения для ручных обновлений; автопроверка — opt-in,
  ≤ раза в 24 ч, только balloon
- CI пинит фид **из тех байтов, которые релиз реально отдаёт** (`scripts/make_feed.py`),
  поэтому фид и ассеты не могут разойтись — см. [Updater_SKILL.MD](Updater_SKILL.MD)

## 🌍 Языки

30 локалей с построчным фолбэком на английский и автоопределением языка ОС при первом запуске
(переключение на лету: **Оформление → Язык**):

| | | | |
|---|---|---|---|
| English (по умолчанию) | Русский | 中文 (简体) | हिन्दी |
| Español | Deutsch | Français | Português |
| 日本語 | 한국어 | Italiano | العربية |
| Indonesian | اردو | Türkçe | Tiếng Việt |
| Polski | ไทย | Українська | Nederlands |
| Română | Ελληνικά | Čeština | Svenska |
| Magyar | Suomi | Dansk | עברית |
| فارسی | বাংলা | | |

Подробности и гид переводчика: [docs/I18N.md](docs/I18N.md).

## 🌗 Темы и оформление

- **Светлая / Тёмная / Системная** — сохраняются, автоопределение при первом запуске,
  быстрый переключатель в титульной строке; иммерсивный тёмный тайтл-бар и скругления Windows 11
- **Акцент**: за колоризацией Windows или 8 встроенных пресетов
- **Движение**: слайды тумблеров 140 мс и hover-состояния (отключаемо), режим компактных строк
- Корректность Per-Monitor-V2 DPI везде

## 🏢 Развёртывание и автоматизация

- **Task Scheduler / logon-скрипты GPO**: `TrayIconGuard.exe --watch` (headless) или
  `--minimized` (GUI в трее)
- **RMM / мониторинг**: `--status --json`, стабильные коды возврата, ротируемые логи за 14 дней
  в `%LOCALAPPDATA%\TrayIconGuard\logs`
- **Безопасность для парка машин**: per-user не требует админа; machine — через
  `--install-machine` из повышенного контекста
- Готовность к Store: MSIX-манифест + ассеты + скрипт упаковки в [`store/`](store/) — см.
  [docs/STORE.md](docs/STORE.md)

## 🔍 Устранение неполадок

| Симптом | Лечение |
|---|---|
| «Неправильная параллельная конфигурация» при старте | exe распакован в папку с именем `*.exe` или не разблокирован; см. [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) |
| Предупреждение SmartScreen при первом запуске | ожидаемо для неподписанных бинарей: Свойства → Разблокировать; гид по подписи в [docs/SMARTSCREEN.md](docs/SMARTSCREEN.md) |
| Значки снова скрылись после обновления приложения | guard на паузе? меню трея → *Пауза/Продолжить*; вкладка «Активность» покажет события наблюдателя |
| Обновление отклонено: sha256 mismatch | дрейф фида/ассетов — перепубликация по [Updater_SKILL.MD](Updater_SKILL.MD) §3 |
| Ничего не показывается на Win10 < 1703 | хранилище не поддерживается; приложение сообщит и предложит легаси-переключатели |

Ещё: [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) · [wiki FAQ](https://github.com/paulmann/windows-show-all-tray-icons/wiki)

## 🛠️ Сборка из исходников

```bash
# Кросс-сборка на Linux (статический, stripped, exe без зависимостей)
sudo apt install g++-mingw-w64-x86-64 cmake
./scripts/build.sh          # гейты: 0 предупреждений, проверка манифеста, аудит только OS-DLL
./scripts/package.sh        # zip + SHA256SUMS

# Или нативно MSVC на Windows
cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release
```

CI гоняет оба варианта на каждый push (ubuntu cross + windows MSVC) и публикует релизы по тегам `v*`.
Подробности: [docs/BUILD.md](docs/BUILD.md).

## 🗂️ Карта репозитория

| Путь | Содержимое |
|---|---|
| `src/core` | движок: хранилище реестра, guard, explorer, backup, autostart, installer, updater, CLI |
| `src/ui` | Fluent-кит, страницы, визард, трей, темы, i18n на 30 локалей |
| `docs/` | инженерные и пользовательские документы (HOW-IT-WORKS, CLI, DESIGN, I18N, STORE, SMARTSCREEN…) |
| `store/` | MSIX-манифест + ассеты Store + `make_msix.ps1` |
| `scripts/` | инструментарий сборки/упаковки/фида (`build.sh`, `package.sh`, `make_feed.py`) |
| `installer/` | опциональные помощники ps1/bat/Inno для корпоративной упаковки |
| `update/` | живой фид обновлений (`stable.json`) |
| `.github/workflows/ci.yml` | гейты + релиз + пайплайн пиннинга фида |

## 🤝 Участие

Issues и PR приветствуются. Пожалуйста, сохраняйте: ноль рантайм-зависимостей, модель
безопасности «только HKCU», гейт сборки без предупреждений (`-Wall -Wextra`) и контракт фида
из `Updater_SKILL.MD`. Правила участия — [`CONTRIBUTING.md`](CONTRIBUTING.md) и [кодекс поведения](CODE_OF_CONDUCT.md); об уязвимостях — через [`SECURITY.md`](SECURITY.md).

## 📄 Лицензия

[PolyForm Noncommercial License 1.0.0](LICENSE) — свободно для некоммерческого использования;
коммерческое лицензирование — через автора.

## 👨‍💻 Автор и поддержка

**Mikhail Deynekin** · <icons@Deynekin.com> · [Deynekin.com](https://Deynekin.com) ·
[GitHub](https://github.com/paulmann) ·
[База знаний (wiki)](https://github.com/paulmann/windows-show-all-tray-icons/wiki) ·
[Лицензия](https://github.com/paulmann/windows-show-all-tray-icons/blob/main/LICENSE)

## 🎯 Дорожная карта

- [ ] Пайплайн подписи кода (репутация SmartScreen)
- [ ] RTL-зеркалирование для арабского/иврита/фарси/урду
- [ ] MSI-упаковка для SCCM/Intune Win32 apps
- [ ] Нативная сборка ARM64

---

<sub>Сделано с 🧡 для аккуратных панелей задач. TrayIconGuard не аффилирован с Microsoft.</sub>
