ImGui: отрисовка курсора
Отрисовка курсора с помощью ImGui.
Отрисовка курсора на экране через ImGui
В этом руководстве показано, как нарисовать простой визуальный оверлей — например, зелёную рамку вокруг курсора мыши — с помощью Dear ImGui через библиотеку ClickableTransparentOverlay.
Мы будем использовать ImGui.NET — официальный .NET-байндинг для ImGui — и рендерить всё прямо в полноэкранное прозрачное overlay-окно, которое не блокирует ввод мыши.
Что такое ImGui?
ImGui (Immediate Mode GUI) — это быстрая и минималистичная UI-библиотека, которую часто используют для отладки, dev-инструментов, оверлеев и кастомных редакторов. В отличие от классических retained-mode UI-библиотек, ImGui перерисовывает весь интерфейс каждый кадр, поэтому она особенно хорошо подходит для HUD, debug-панелей и других инструментов реального времени.
Что потребуется
Убедитесь, что у вас подключён следующий NuGet-пакет:
#r "nuget: ClickableTransparentOverlay, 10.2.0"
Этот пакет предоставляет базовый класс Overlay, который берёт на себя создание окна, настройку ImGui и рендеринг.
Полный пример: отслеживание курсора через ImGui
#r "nuget: ClickableTransparentOverlay, 10.2.0"
using ClickableTransparentOverlay;
using System.Threading.Tasks;
using ImGuiNET;
try
{
Log.Info("Booting up ImGui OSD");
using var overlay = new SampleOverlay(cancellationToken);
await overlay.Run(); // Starts the overlay loop
}
catch (Exception ex)
{
Log.Error("ImGui OSD encountered an error", ex);
throw;
}
finally
{
Log.Info("ImGui OSD was closed");
}
internal class SampleOverlay : Overlay
{
private readonly CancellationToken cancellationToken;
public SampleOverlay(CancellationToken cancellationToken)
: base( // Fullscreen on primary monitor
System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width,
System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height)
{
this.cancellationToken = cancellationToken;
}
// Called every frame
protected override void Render()
{
// Graceful shutdown if requested
if (cancellationToken.IsCancellationRequested)
{
Close();
return;
}
// Get the current ImGui draw list
var drawList = ImGui.GetBackgroundDrawList();
// Get the current cursor position (in screen coordinates)
var cursorPosition = UnsafeNative.GetCursorPosition();
// Draw a green 10x10 rectangle centered on the cursor
drawList.AddRect(
cursorPosition.OffsetBy(-5, -5).ToVector2(),
cursorPosition.OffsetBy(5, 5).ToVector2(),
ImGui.GetColorU32(new System.Numerics.Vector4(0f, 1f, 0f, 1f)), // Green
0f, // Corner rounding
ImDrawFlags.None, // No flags
1f // Thickness
);
}
}
Основные моменты
ImGui.GetBackgroundDrawList()даёт доступ к canvas для рисования в фоновом слое.AddRect()рисует прямоугольник в экранных координатах.- Цвет передаётся как
Vector4(RGBA) и затем преобразуется черезImGui.GetColorU32. OffsetBy(x, y)здесь предполагается как вспомогательный метод, который возвращает новыйPoint, смещённый на указанную дельту.- Базовый класс
Overlayсам запускает frame loop и обрабатывает прозрачность окна.
Что можно добавить дальше
- Подпись или tooltip рядом с курсором
- Разные фигуры в зависимости от состояния
- Обработку кликов или взаимодействия с overlay
- Отображение debug-данных или игровых визуальных элементов в реальном времени