Остров в духе iPhone у верхнего края экрана: показывает, что играет, громкость, таймер и системные события, а по клику раскрывается в плеер.
Написан на WPF (.NET 8) без сторонних пакетов — только Windows API.
- Музыка. Обложка, название и эквалайзер для любого приложения с системной медиасессией (Spotify, браузер, Яндекс Музыка…). Цвет полосок берётся из обложки, и в тот же цвет окрашивается светлый ободок острова. При смене трека новая обложка выталкивает старую — влево для следующего трека, вправо для предыдущего.
- Текст песни. Синхронные строки с LRCLIB прямо в компактном острове; он растягивается под длину строки.
- Плеер. По клику — большая обложка, перемотка, «назад / пауза / вперёд» и подсветка в цветах обложки, которая движется под звук. Если у трека есть текст, плеер становится выше и показывает три строки: та, что поётся, стоит посередине и заливается светом слева направо, соседние — меньше и не в фокусе.
- Несколько источников. Если музыка есть сразу в нескольких приложениях (Spotify и вкладка браузера), Ctrl + колесо над островом листает их по кругу; остров называет приложение, к которому перешёл. Выбор держится, пока играть не начнёт другое приложение.
- Живой спектр. Полоски считаются по реальному выводу звука (WASAPI loopback), а не случайно.
- Громкость. Индикатор при изменении громкости; колесо мыши над островом её меняет. На 0 и 100% полоска тянется дальше, как резинка, и возвращается. Над раскрытым плеером колесо меняет громкость только того приложения, которое играет, — как его ползунок в системном микшере; уровень на секунду появляется слева от кнопок.
- Таймер. От 1 до 99 минут. Пока играет музыка, таймер отделяется в отдельный «пузырь» рядом — вытягивается из острова, как капля. Последние 10 секунд отсчёт краснеет и пульсирует. По окончании звонит, пока не кликнете.
- Полка для файлов. Перетащите файлы на остров — он раскроется в полку и подержит их у себя; или нажмите «+» на полке (на пустой — саму полку) и выберите файлы в обычном окне. На полке — превью для фото и видео, иконки для остального. Пока на полке что-то лежит, рядом с островом висит пузырь с числом файлов. Файл с полки перетаскивается куда угодно — в папку, чат, письмо — и копируется туда, а оригинал остаётся на месте; положенный куда-то, он уходит с полки. Клик по файлу открывает его. Полка помнит файлы между запусками.
- Заряд наушников. Процент заряда Bluetooth-наушников — в раскрытом острове и в плеере, при подключении и отдельным предупреждением на 20% и 10%. Показывается для устройств, которые сообщают заряд Windows (тот же процент, что в «Параметрах»).
- Уведомления. Подключение зарядки, смена аудиоустройства (наушники, Bluetooth), Wi-Fi / Ethernet, включение и отключение VPN, режим «Не беспокоить» — луна в острове, а пока режим включён, она стоит и рядом с датой в раскрытых часах.
- Не мешает. Прячется, когда на весь экран открыта игра или видео, не появляется в Alt-Tab и не забирает фокус.
- Настройки. Текст песен, эффекты его строк в плеере (заливка, размер и размытие соседних), цветной ободок, громкость приложения в плеере, уведомления о сети, скрытие на полном экране и автозапуск выключаются на странице «Настройки» в меню.
- Оформление. На соседней странице меню — размер острова (85–130%), отступ от верхнего края экрана (0–24 px) и акцентный цвет: один из девяти вместо цветов обложки для полосок, подсветки плеера и ободка.
| Действие | Результат |
|---|---|
| Клик | Раскрыть плеер или таймер, повторный клик — свернуть |
| Клик по обложке в плеере | Открыть приложение, в котором играет музыка |
| Правый клик | Меню: таймер, полка, настройки, оформление, закрыть остров; со страницы настроек или оформления — назад в меню |
| Клик колесом | Спрятать остров на 5 секунд |
| Колесо мыши | Громкость: общая, над раскрытым плеером — играющего приложения (в настройке таймера — минуты, на странице оформления — значение строки под курсором, на полке — листает файлы) |
| Ctrl + колесо | Следующее или предыдущее приложение с музыкой |
| Клик по звонящему таймеру | Выключить звонок |
| Перетащить файлы на остров | Положить их на полку |
| «+» на полке или клик по пустой полке | Выбрать файлы для полки в обычном окне |
| Перетащить файл с полки | Скопировать его туда, куда отпустили |
| Клик по файлу на полке | Открыть его; крестик в углу — убрать с полки |
| Клик по пузырю | Открыть таймер или полку — ту половину, по которой кликнули |
Готовый DynamicIsland.exe лежит в релизах. Устанавливать ничего не нужно: скачайте и запустите. Подходит для 64-битных Windows 10 2004 (сборка 19041) и новее, Windows 11.
Файл не подписан, поэтому при первом запуске SmartScreen может предупредить о неизвестном издателе: «Подробнее» → «Выполнить в любом случае».
Нужен .NET 8 SDK.
git clone https://github.com/mihailkotovski/DynamicIsland.git
cd DynamicIsland
dotnet run -c ReleaseОдин exe-файл, которому не нужен установленный .NET — так же собирается релиз:
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:EnableCompressionInSingleFile=true -o publishРелиз собирает GitHub Actions (release.yml) — достаточно запушить тег:
git tag v1.1.0
git push origin v1.1.0Остров рисуется шрифтом SF Pro: файлы лежат в Fonts и встраиваются в exe при сборке. Шрифт принадлежит Apple и распространяется на условиях её лицензии. Без этих файлов используется Segoe UI.
DynamicIsland.exe --view MediaBig
DynamicIsland.exe --timer 90--view закрепляет одно состояние острова (Idle, Media, Timer, Volume, Charge, Toast, Notice, MediaBig, IdleBig, TimerBig, TimerSet, Menu, Settings, Look), --timer сразу запускает отсчёт на указанное число секунд.
Необработанные ошибки пишутся в %TEMP%\DynamicIsland.log.
| Файл | За что отвечает |
|---|---|
MainWindow.xaml(.cs) |
Все состояния острова, переходы между ними, указатель |
Spring.cs |
Пружина, на которой построено каждое движение |
Goo.cs |
Чёрное тело острова: пилюля, пузырь и перемычка, которая тянется между ними и рвётся |
Icon.cs |
Собственные иконки: громкость, наушники, сеть, VPN, таймер |
MediaService.cs |
Текущий трек через системную медиасессию (GSMTC), выбор между несколькими приложениями, цвет из обложки |
Cover.cs |
Обложка: новая выталкивает старую в сторону, куда листается плейлист |
SourceApp.cs |
Приложение, в котором играет музыка: переход к его окну, имя, его процессы |
LyricsService.cs |
Поиск и разбор синхронного текста с LRCLIB |
Lyric.cs |
Строка текста в плеере, которая заливается светом, пока её поют |
Spectrum.cs |
Захват вывода звука и разложение по частотам |
Equalizer.cs, Aura.cs |
Полоски и подсветка плеера |
AudioService.cs |
Громкость — общая и отдельного приложения — и смена устройства вывода (Core Audio) |
Headset.cs |
Заряд Bluetooth-наушников |
NetworkService.cs |
Состояние сети и VPN |
Timer.cs, Ring.cs, Digits.cs |
Отсчёт, звонок, кольцо и перелистывание цифр |
Settings.cs, Toggle.cs |
Настройки и оформление из меню, переключатель |
RowList.cs |
Строки меню и подсветка, которая перетекает между ними за курсором |
Native.cs |
Win32: поверх всех окон, полноэкранный режим, батарея, автозапуск, клавиши громкости и треков |
Единственный сетевой запрос — поиск текста на lrclib.net: туда уходят название трека и исполнитель. Больше приложение ничего никуда не отправляет. Если выключить «Текст песен» в меню, не будет и этого запроса.
Автозапуск включается записью в HKCU\Software\Microsoft\Windows\CurrentVersion\Run и выключается тем же переключателем. Остальные переключатели меню и оформление хранятся в HKCU\Software\DynamicIsland.