Motion blur / плавный шлейф для курсора Windows вместо стандартных «клонов» из настройки «Отображать след указателя».
Программа живёт в трее, ничего не патчит и не требует прав администратора. Работает так: прозрачное click-through окно поверх всех окон каждый кадр (на частоте монитора) рисует полупрозрачные копии текущего системного курсора вдоль траектории движения, с затуханием по времени. Настоящий курсор Windows остаётся сверху и чётким — шлейф идёт за ним.
Нужен .NET 10 SDK (или правь TargetFramework в CoolCursor.csproj под свою версию).
build.bat основная сборка: uiAccess + подпись + установка в Program Files + запуск (см. ниже)
build.bat portable обычная сборка без uiAccess -> bin\Release\net10.0-windows\CoolCursor.exe
build.bat run portable-сборка и запуск
build.bat publish однофайловый portable exe в bin\publish (без слоя над Пуском, нужен .NET 10 Runtime)
build.bat package пакет для друга: dist\CoolCursor-Setup.zip (см. ниже)
build.bat uninstall удалить uiAccess-установку и сертификат
Или напрямую dotnet build -c Release.
Однофайловая сборка, чтобы кинуть другу:
dotnet publish -c Release -r win-x64 --self-contained false -p:PublishSingleFile=true
Запусти CoolCursor.exe — появится иконка в трее. Правый клик:
- Включено — вкл/выкл эффект (двойной клик по иконке делает то же самое).
- Режим — Motion blur (фосфор), Motion blur (классический) или Плавный шлейф (лента).
- Фосфор (по умолчанию) — накопительный буфер: курсор впечатывается в него один раз в каждой пройденной точке, а буфер каждый кадр экспоненциально гаснет. Между кадрами меняется только яркость, положение элементов не пересчитывается — поэтому нет мерцания «решётки» копий, которое глаз видит как дробление хвоста. Последний отрезок и предсказанная голова рисуются поверх временно и в буфер не попадают.
- Классический — хвост целиком пересобирается из траектории каждый кадр (smoothstep-затухание).
- Длина шлейфа — сколько миллисекунд живёт хвост (по умолчанию 300 мс).
- Интенсивность — непрозрачность хвоста у самого курсора.
- Плотность blur — шаг между копиями курсора; 1–2 px даёт сплошное размытие, 8 px — редкие «призраки».
- Частота кадров — авто = максимальная частота обновления среди мониторов.
- Сглаживание траектории — позиция курсора опрашивается ~1000 раз в секунду, а через точки проводится центростремительный сплайн Catmull-Rom, так что хвост не «квадратится» на поворотах.
- Компенсация задержки — аппаратный курсор двигается мгновенно, а оверлей проходит через композитор DWM и отстаёт на ~1 кадр, из-за чего при рывке голова хвоста «отрывается» и выглядит как вторая стрелка. Голова хвоста предсказывается методом dead reckoning: от последнего отчёта мыши вперёд на его возраст плюс указанную задержку (Авто = 1 кадр), с учётом угловой скорости — на дугах голова продолжает дугу, а не улетает по касательной.
- Пауза в полноэкранных приложениях — по умолчанию рендер останавливается, когда в фокусе окно без рамки, ровно накрывающее свой монитор (Minecraft по F11 и т.п.): в эксклюзивном полноэкране оверлей всё равно не виден, и нечего зря считать. Снаружи эксклюзив не отличить от borderless, поэтому borderless-игры и браузер в F11 тоже попадают под паузу; если это мешает — «Только эксклюзивный D3D» или «Никогда». Курсор, который приложение «спрятало», подменив прозрачным, считается скрытым всегда.
- Запускать вместе с Windows — пишет ключ в
HKCU\...\Run. - Открыть settings.json — все параметры (в т.ч. цвет и толщина ленты) лежат в
%AppData%\CoolCursor\settings.json.
При старте программа выключает стандартный «след указателя» Windows (если он был включён) и возвращает его при выходе.
Меню Пуск, Центр уведомлений и другие «иммерсивные» панели Windows живут в z-полосе выше любых обычных topmost-окон, поэтому обычная сборка рисует хвост под ними. Единственный документированный способ подняться выше — манифест с uiAccess="true", но такой exe Windows запускает только подписанным и из Program Files.
Скрипт делает всё сам (PowerShell от администратора, из папки проекта):
Set-ExecutionPolicy -Scope Process Bypass
.\install-uiaccess.ps1
Он собирает проект с -p:UiAccess=true, создаёт самоподписанный сертификат «CoolCursor Dev», добавляет его в доверенные корневые и доверенные издатели этой машины, подписывает exe и копирует программу в C:\Program Files\CoolCursor. Удалить всё вместе с сертификатом: .\install-uiaccess.ps1 -Uninstall.
Обычная dotnet build без параметра по-прежнему даёт «портативный» exe без uiAccess, который запускается откуда угодно.
build.bat package собирает dist\CoolCursor-Setup.zip: self-contained сборка (.NET внутри, ставить ничего не надо) с uiAccess-манифестом плюс install.bat, uninstall.bat и README.txt. У получателя install.bat показывает один UAC-запрос, создаёт на его машине собственный сертификат «CoolCursor Local», подписывает им exe, ставит в C:\Program Files\CoolCursor, добавляет в автозапуск и запускает. Подпись твоей машины ему не подошла бы — сертификату доверяет только тот компьютер, где он создан, поэтому подпись выполняется на месте.
| Файл | Что делает |
|---|---|
OverlayWindow.cs |
Окно с WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST | WS_EX_NOACTIVATE — не ловит мышь, не забирает фокус. |
Renderer.cs |
Поток рендера: опрос GetCursorInfo на ~1 кГц, сглаживание Catmull-Rom, предсказание головы, фосфорный накопительный буфер (или раскладка «призраков» с равным шагом по длине пути в классическом режиме), отрисовка в DIB-буфер размером только с bounding box хвоста и вывод через UpdateLayeredWindow. |
CursorCapture.cs |
Превращает HCURSOR в bitmap с честной альфой: курсор рисуется через DrawIconEx на чёрном и на белом фоне, из разницы восстанавливается прозрачность. Работает и с монохромными (XOR) курсорами. |
TrayApp.cs |
Иконка в трее, меню, автозапуск, отключение системного следа. |
Settings.cs |
JSON-настройки. |
install-uiaccess.ps1 |
Сборка с uiAccess, подпись, установка в Program Files. |
Чтобы n наложенных копий не сливались в сплошную заливку, каждая копия получает альфу 1 − (1 − A)^(spacing / width), где A — целевая непрозрачность в этой точке хвоста.
- Поверх игр в эксклюзивном полноэкранном режиме (например, Minecraft по F11) оверлей не виден — как и любой другой без инъекции в рендер игры: игра владеет монитором напрямую, DWM не композитит. Обходы: borderless-режим; на NVIDIA — Панель управления → Управление параметрами 3D → «OpenGL present method» → «Prefer layered on DXGI Swapchain», тогда OpenGL-игры идут через DWM и оверлей виден.
- Анимированные курсоры («крутилка») рисуются первым кадром.
- Окна с
uiAccess/UAC-приглашения перекрывают оверлей — это нормально.