От слепых операций RDP до публикации в MS Store: история создания RDP Heartbeat
2026-03-29
Tags: [Дневник разработчика](/ru/blog/tags/#Дневник разработчика) · Продукты · RDP · Windows
Пролог: Незваный гость во время vibe coding
Я часто подключаюсь к RDP-машине по UDP, чтобы писать код, погружаясь в то сфокусированное и расслабленное состояние «vibe coding».
В процессе неизбежно встречаются длительные операции: ожидание медленного API или скрипта, обрабатывающего что-то в фоновом режиме. Когда экран замирает на одном окне надолго — это совершенно нормально. Обычно я просто не обращаю внимания, открываю браузер или откидываюсь в кресле.
Но потом я обнаружил невероятно раздражающий феномен: иногда задача давно завершилась — просто мой экран RDP полностью завис.
Не уверен, страдают ли чистые TCP-подключения от той же проблемы (задержка TCP относительно высока, а я предпочитаю плавность UDP), но в режиме UDP это «замерзание Шрёдингера» определённо существует.
Худший сценарий: Не отключился — просто ослеп
Если сеть плохая и RDP показывает окно «Соединение разорвано» — это на самом деле хорошо, по крайней мере я знаю, что нужно переподключиться.
Самое мучительное: хотя экран больше не обновляется, события клавиатуры и мыши всё ещё отправляются!
Представьте картину: я смотрю на замершый экран, думая, что скрипт ещё работает. В нетерпении шевелю мышью — экран не реагирует. Слепо кликаю, жму Enter несколько раз, пытаясь «разбудить»... тишина.
В конце концов закрываю окно RDP и подключаюсь заново. Только тогда с ужасом обнаруживаю: все эти слепые клики и нажатия были реально выполнены на удалённой машине. Работа без визуальной обратной связи — худший кошмар разработчика.
Никаких сложных панелей — просто один успокаивающий взгляд
Моё требование было крайне простым и чистым: маленькая штучка, тихо плавающая в углу экрана навсегда.
Если она мигает — я знаю, что экран обновляется в реальном времени, и могу спокойно ждать ответа API. Если останавливается — сразу понимаю: «Ага, опять завис, пора переподключаться» — идеально избегая катастрофы слепых операций.
Счастливая случайность: Магический эффект «Keep-Alive»
Так родился RDP Heartbeat. Спроектированный быть максимально незаметным — click-through, абсолютно не мешающий обычной работе. Его единственная миссия: дать вам ту каплю «визуального подтверждения», которая нужнее всего при удалённой работе.
Но произошло нечто интересное: после начала его использования зависания экрана RDP стали невероятно редкими.
Это стало полной неожиданностью. Моя гипотеза: поскольку этот пульсирующий огонек постоянно обновляет пиксели в углу экрана, это непрерывное обновление работает как механизм «keep-alive» на уровне приложения, поддерживая активный поток данных для сессии RDP. Честно говоря, я не углублялся в механизмы сетевых протоколов, так что не могу утверждать наверняка. Одним словом: работает как по волшебству.
Раз уж сделал, почему бы не опубликовать (и ямы на этом пути)
Глядя на эту маленькую мигающую штучку в углу, я подумал, что другие разработчики с такой же болью тоже могут ей воспользоваться. И решил опубликовать в Microsoft Store.
Оказалось, что это было невероятно мучительное решение.
Поскольку я писал на Python, весь процесс упаковки и публикации превратился в одиссею крови и слёз: Исходный код Python → exe через PyInstaller → инсталлятор Inno Setup → и наконец пакет MSIX. По сравнению с плавным опытом упаковки нативного WinUI 3, этот конвейер — горная дорога с восемнадцатью поворотами.
Также должен признать, что десктопное приложение на Python немного уступает в визуальной отделке.
Планы на будущее
Когда будет время, планирую написать подробную статью обо всём процессе упаковки от Python до MSIX. Это точно не оптимальное решение, но это рабочий путь — надеюсь, он поможет тем, кто хочет опубликовать свои Python-инструменты в Store.
Что касается самого RDP Heartbeat, надеюсь найти время полностью переписать его на нативном WinUI 3, чтобы этот маленький пульсирующий огонёк стал ещё более плавным и элегантным.
Если вы тоже часто смотрите на замерзшие удалённые экраны или страдаете от внезапных зависаний RDP, попробуйте этот маленький инструмент. Надеюсь, он сохранит хорошее настроение в каждом вашем сеансе vibe coding.