Skip to content

Repository files navigation

CoolCursor

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 (если он был включён) и возвращает его при выходе.

Поверх меню Пуск (uiAccess)

Меню Пуск, Центр уведомлений и другие «иммерсивные» панели 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-приглашения перекрывают оверлей — это нормально.

About

Adds a trail behind the cursor.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages