AI OSD и экранные оверлеи
Карта API Blazor для экранных оверлеев и OSD canvas.
Screen Overlay / Blazor OSD — карта навигации
Краткая карта по отрисовке аннотаций поверх экрана через overlay-канвас на базе Blazor: прямоугольники, HTML-метки, Razor-компоненты и CV debug boxes.
Интерактивный выбор объектов вынесен в osd/selection.md.
Что обычно нужно
- Нарисовать прямоугольник вокруг области.
- Показать HTML-метку или badge поверх рабочего стола.
- Отрисовать Razor-компонент как плавающую аннотацию.
- Показать bounding boxes для CV/ML.
- Открыть DevTools для overlay WebView.
Как это устроено
IOnScreenServiceсоздает canvases с областью владения по owner.IOnScreenCanvasScriptingApi— фабрика canvas для скриптов.IOnScreenCanvasуправляет экземплярамиIOnScreenObjectпоOnScreenObjectId.- Объекты используют координаты экрана рабочего стола.
- Текущие контракты отображаемых объектов —
IOnScreenRectangle,IOnScreenHtmlиIOnScreenRazor. - Внутри renderer использует прозрачное click-through окно Blazor/WebView; снаружи нужно работать через canvas/object API.
Показать рамку на пять секунд
Верхнеуровневый C# Script в desktop EyeAuras получает фабрику canvas из
скриптового контейнера. UI-модуль регистрирует IOnScreenService, а scripting-модуль —
IOnScreenCanvasScriptingApi. Нужны сборки EyeAuras.Shared и
EyeAuras.Blazor.Controls, доступные в этом хосте.
using System;
using System.Drawing;
using System.Threading.Tasks;
using EyeAuras.Shared.Scripting;
using EyeAuras.Blazor.Controls.ScreenOverlay;
{
var api = GetService<IOnScreenCanvasScriptingApi>();
using var canvas = api.Create();
try
{
using var rectangle = canvas.AddRectangle();
rectangle.Location = new Point(100, 100);
rectangle.Size = new Size(240, 120);
rectangle.Background = Color.Transparent;
rectangle.BorderColor = Color.Red;
rectangle.BorderThickness = 2;
await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
}
finally
{
canvas.Clear();
}
}
Появится прозрачная рамка с красной границей в экранных координатах. При
выходе или отмене освобождается объект, его регистрация удаляется, затем
очищается и освобождается canvas. Для кода приложения аналогичная точка
получения — внедрённый IOnScreenService.Create(), а не глобальный GetService.
Реализация общего окна выставляет PrimaryScreen.Bounds; наличие экранных
координат в API не гарантирует отображения на всех мониторах или одинакового DPI.
Добавить объект и затем убрать его
AddRectangle() без аргументов создаёт и регистрирует объект. Перегрузка
AddRectangle(builder) только создаёт объект и вызывает builder: если тот
не регистрирует объект, вызовите canvas.AddOrUpdate(rectangle) сами.
AddHtmlObject() и AddRazor<T>(dataContext) сразу добавляют объект.
Простой new также требует AddOrUpdate.
Remove(object) и Clear() убирают записи с canvas, но не заменяют Dispose
принадлежащих вам объектов. Фабричные helpers добавляют удаление с canvas в
ресурсы объекта. Не полагайтесь на освобождение всех объектов при одном
canvas.Dispose(); завершайте своё владение явно.
IOnScreenHtml.Html — доверенный HTML, а не текст с автоматическим экранированием.
Для Razor нужен реальный компонент и доступные ему зависимости; члены верхнего
уровня скрипта не становятся переменными компонента. Размер, видимость и
позицию задавайте самому объекту. Контракт здесь — EyeAuras 20fd3d4.
Показать подпись до Stop
HTML-объект подходит для короткой подписи. Пример C# Script создаёт собственный canvas и размещает подпись рядом с известной экранной точкой:
using System;
using System.Drawing;
using System.Threading;
using System.Threading.Tasks;
using EyeAuras.Shared.Scripting;
using EyeAuras.Blazor.Controls.ScreenOverlay;
{
using var canvas = GetService<IOnScreenCanvasScriptingApi>().Create();
try
{
using var label = canvas.AddHtmlObject();
label.Location = new Point(320, 180);
label.Size = new Size(180, 36);
label.Html = "<div style='color:white;background:#222;padding:4px'>Найден объект</div>";
label.IsVisible = true;
try { await Task.Delay(Timeout.Infinite, cancellationToken); }
catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) { }
}
finally { canvas.Clear(); }
}
Location — положение в экранных координатах, а не координаты внутри окна
или CV-кадра. Для переменного пользовательского текста сначала примените
System.Net.WebUtility.HtmlEncode, затем вставляйте его в доверенную
обёртку. Не присваивайте произвольную разметку из внешнего источника.
Обновлять один объект и временно скрывать его
В следующем отдельном C# Script одна рамка меняет положение. Четыре шага она скрыта; затем появляется снова. Это модель обновлений, поступающих от вашего источника, а не подписка на несуществующий глобальный поток прямоугольников:
using System.Drawing;
using System.Threading.Tasks;
using EyeAuras.Shared.Scripting;
using EyeAuras.Blazor.Controls.ScreenOverlay;
{
using var canvas = GetService<IOnScreenCanvasScriptingApi>().Create();
try
{
using var box = canvas.AddRectangle();
box.Size = new Size(100, 60);
box.Background = Color.Transparent;
box.BorderColor = Color.Lime;
box.BorderThickness = 2;
for (var step = 0; step < 12; step++)
{
box.Location = new Point(100 + step * 10, 120);
box.IsVisible = step < 4 || step >= 8;
await Task.Delay(250, cancellationToken);
}
}
finally { canvas.Clear(); }
}
В реальном обработчике меняйте свойства сохранённого box, а не вызывайте
AddRectangle() на каждом обновлении. Его Id остаётся тем же.
IsVisible = false сохраняет объект для следующего показа, Dispose
окончательно удаляет регистрацию, а Clear() касается только этого canvas.
Не заменяйте свою область владения глобальным canvas другого скрипта.
Основные API
IOnScreenService— runtime-фабрика canvas и хук для DevTools.IOnScreenCanvasScriptingApi— фабрика canvas для скриптов.IOnScreenCanvas—ObjectsById,AddOrUpdate,Remove,Clear,ShowDevTools.IOnScreenObject—Id,Location,Size,Opacity,IsVisible.IOnScreenRectangle—Background,BorderColor,BorderThickness.IOnScreenHtml— сырой доверенныйHtml.IOnScreenRazor—ViewTypeиDataContext.OnScreenCanvasExtensions—AddRectangle,AddHtmlObject,AddRazor<T>.
Что предпочтительно
- Для overlay, которыми владеет скрипт, используйте
IOnScreenCanvasScriptingApi. - Для кода приложения и runtime-логики используйте
IOnScreenService. - Для встроенных объектов используйте
AddRectangle,AddHtmlObjectиAddRazor<T>. - Для очистки предпочитайте корректно освобождать объекты и canvas через dispose.
- Для настоящих окон используйте
windows-subsystems/blazor-windows.md. - Для UI на ImGui используйте
nuget/imgui-sdk.md.
Чего избегать
- Не создавайте собственные прозрачные WebView-окна, если нужны только простые аннотации.
- Не передавайте недоверенный HTML в
IOnScreenHtml. - Не используйте screen overlay как input picker.
Опорные термины для поиска
IOnScreenCanvas,IOnScreenCanvasScriptingApi,IOnScreenService,IOnScreenObject,IOnScreenRectangle,IOnScreenHtml,IOnScreenRazor,OnScreenCanvasExtensions,AddRectangle,AddHtmlObject,AddRazor,OnScreenOverlayComponent.
Синонимы для поиска
- screen overlay
- Blazor OSD
- desktop overlay
- click-through overlay
- bounding box overlay
- debug overlay
- HTML overlay
- Razor overlay
- screen annotation
Смежные карты
osd/selection.mdwindows-subsystems/blazor-windows.mdnuget/imgui-sdk.mdcomputer-vision/images.md