Справочная карта по опциональному пакету EyeAuras.ImGuiSdk: цикл рендера ImGui, управляемые окна ImGui, переиспользуемый контент, изображения, шрифты и RE-стиль tool windows.
ReProcess.EyeAuras.ImGuiSdk — это опциональный NuGet-пакет.ImGuiContainerExtensions.IImGuiExperimentalApi отвечает за точку входа overlay/render-loop.AddRenderer(...) подписывает per-frame renderer.RunOnce(...) планирует callback на один кадр.ImGuiWindowManager управляет managed tool windows.ICanBeDisplayedInImGui — контракт для переиспользуемого контента.IImGuiWindowContent получает ImGuiWindowCtx.IScriptFileProvider.Для script mini-apps у EyeAuras.ImGuiSdk есть два обязательных шага настройки:
EyeAuras.ImGuiSdk.AddNewExtension<ImGuiContainerExtensions>();
var imgui = GetService<IImGuiExperimentalApi>();
Не рассчитывайте, что IImGuiExperimentalApi, ImGuiWindowManager или другие сервисы ImGui SDK будут доступны только потому, что пакет успешно компилируется. Без ImGuiContainerExtensions получение сервисов может завершиться ошибкой или вернуть неполностью настроенный host.
IImGuiExperimentalApi — render loop, настройки, шрифты, изображения.ImGuiContainerExtensions — регистрирует сервисы ImGui SDK в script DI.WhenRender, AddRenderer, RunOnce — интеграция в кадр.NoActivate, ShowInTaskbar, VSync, MaxFramesPerSecond — поведение overlay/окна и pacing кадров.ImGuiWindowManager.OpenNew(...) — managed windows.ImGuiNewWindowArgs — параметры создания окна.ImGuiWindowHost — lifetime хостируемого окна.ICanBeDisplayedInImGui — ToImGui().IImGuiWindowContent — контент, знающий об окне.IImGuiWindowContentPreBegin — pre-Begin hook.ImGuiWindowCtx — заголовок, фокус, запрос на закрытие.ImGuiEx — вспомогательные контролы и утилиты.IImGuiExperimentalApi.AddFont(...) — добавить байты шрифта и получить ImGuiFontSpec.IImGuiExperimentalApi.ReplaceFont(...) — сделать шрифт шрифтом по умолчанию.IImGuiExperimentalApi.RemoveFont(...) — удалить зарегистрированный шрифт.IImGuiExperimentalApi.GetOrAddImage(...) / RemoveImage(...) — явная регистрация texture/image.EyeAuras.ImGuiSdk.EyeAuras.ImGuiSdk, ImGuiNET и часто System.Numerics.ImGuiContainerExtensions до получения сервисов ImGui SDK из script container.ImGuiEx — первое место, куда стоит смотреть, прежде чем писать собственные виджеты.
EnumCombo<TEnum> для выбора enum.ComboBoxEx<T> для одиночного и множественного выбора с фильтрацией, preview text и callbacks для checked-state.DropdownButton<T> для фильтруемых picker'ов, открывающихся по кнопке.Checkbox(label, getter, setter) для checkbox, привязанного к свойству.ToggleButton(...) для кнопок вкл/выкл с активным стилем.ConfirmButton(...) для destructive или рискованных команд, которым нужен явный второй клик, подтверждение Enter, отмена через Escape или auto-revert.TextField(...) для строк с label + растянутым полем ввода.TextFieldWithConfirmButtons(...) для сценариев edit/save/cancel.HotkeyEditor(...) для записи ImGuiKey; есть overload'ы для WPF Key и WinForms Keys.FlexHorizontal(...) для горизонтальных строк на базе таблиц.Stretched(...) для layout'а значение + action фиксированной ширины.ImGuiListClipper() для больших повторяющихся списков.DisplayPropertyGrid(...) для просмотра объектов и словарей.DisplayErrors(...) для IHasErrorProvider.RenderToImGui(...) для типовых значений, ICanBeDisplayedInImGui, путей, матриц и fallback-значений с copy-on-click.MarkdownBox(...) для markdown-текста с опциональным кастомным рендерингом ссылок.ImageRgba32(...) для текстур Image<Rgba32>.ImageFromUrl(...) для рендера изображений из URL/data.AddFont, ReplaceFont, PushFont, PopFont, GetAwesomeFont и AwesomeIcon(...) для кастомных шрифтов и встроенных иконок Font Awesome.TextUnformattedOutlined(...) и TextOutline(...) для читаемых overlay labels.ColorExtensions конвертирует System.Drawing.Color, System.Windows.Media.Color и Vector4 в форматы цветов ImGui.ImGuiExtensions добавляет хелперы draw-list, например rectangles, dashed lines, dashed circles и filled circles.ImDrawListWorldExtensions содержит W2S/world-space helpers для ESP-style рисования: линии, 2D/3D boxes, spheres, cylinders и world text.IImGuiExperimentalApi.AddFont(...) для регистрации шрифта и ReplaceFont(...), чтобы сделать его шрифтом по умолчанию.AddFontFromMemoryTTF; в текущем SDK используется AddFont(...) и опционально ReplaceFont(...).ImGuiEx.PushFont(fontSpec) / PopFont(fontSpec).ImGuiFontRangeType, если шрифт должен содержать нестандартные диапазоны glyphs, например Cyrillic, Greek, Japanese, Korean, Thai, Vietnamese или Chinese.IScriptFileProvider, чтобы читать embedded bytes шрифтов, изображений и markdown из script project.ImageRgba32(...), если mini-app уже работает с Image<Rgba32>.ImageFromUrl(...) для URL- или data-image-источников; embedded/local assets обычно лучше читать через IScriptFileProvider.ImGuiEx кэшируют состояние загрузки, texture и preview по ImGui ID.ImGui работает в immediate-mode, но контролы всё равно хранят краткоживущее UI-состояние. Ключ к этому — ImGui ID.
ImGuiEx использует ImGui.GetID(label) и внутренний словарь состояния для многих контролов.ImGuiEx используют один и тот же ID, один может перезаписать кэш состояния другого.Примеры stateful-контролов в ImGuiEx:
ComboBoxEx хранит текст фильтра, состояние open/closed, закреплённую ширину popup и индексы отфильтрованных элементов.DropdownButton хранит текст фильтра, pending multi-select edits, ширину popup и snapshots элементов.ConfirmButton хранит, находится ли кнопка в armed-состоянии, и когда нужно сделать auto-revert.TextFieldWithConfirmButtons хранит режим редактирования, buffer text и запрос фокуса.HotkeyEditor хранит состояние записи, pending key, original key и запрос фокуса.ImageRgba32 / ImageFromUrl хранят состояние texture/loading/preview.MarkdownBox хранит состояние парсинга/рендера и состояние image/copy tooltip.Правила для ID в генерируемом UI:
ImGuiEx.ComboBoxEx("Reader", ...).Reader##local, Reader##kernel.##id, если видимый label рисуется отдельно, а сам виджет должен быть без текстовой метки.###id, если видимый текст меняется, но состояние одного и того же контрола нужно сохранить.ImGui.PushID(stableItemId) / ImGui.PopID().Guid.NewGuid(), timestamps, случайных значений или меняющегося display text.ImGuiEx кэширует состояние по ID.ImGui и ImGuiEx.ImGuiEx через partial class из script project; partial-файлы ImGuiEx относятся к самой сборке ImGui SDK.label, текущее значение и setter или ref value, а затем возвращать true, если пользователь что-то изменил.ICanBeDisplayedInImGui или IImGuiWindowContent.PushID и скрытые labels.ImGui.GetID(label) в текущем ID stack.IImGuiWindowContent, если контролу или панели нужен доступ к ImGuiWindowCtx, чтобы менять заголовок, запрашивать фокус или закрытие.IImGuiWindowContentPreBegin только тогда, когда контенту действительно нужно вызвать ImGui.SetNextWindow* до того, как managed window вызовет ImGui.Begin.Пример формы:
static bool ReaderPicker(
string label,
IReadOnlyList<ReaderOption> readers,
ref ReaderOption selected)
{
return ImGuiEx.ComboBoxEx(label, readers, ref selected,
new ImGuiEx.ComboBoxExOptions<ReaderOption>
{
ItemTextGetter = x => x.Name,
ShowFilter = true,
FilterHint = "Filter readers..."
});
}
Для более крупной панели вынесите состояние в класс и реализуйте ICanBeDisplayedInImGui.ToImGui(). Такая панель может вызывать хелпер выше на каждом кадре и реагировать только тогда, когда он возвращает true.
Форма для stateful custom control:
private sealed class SearchBoxState
{
public bool FocusNext;
}
private static readonly Dictionary<uint, SearchBoxState> SearchBoxStates = new();
static SearchBoxState GetSearchBoxState(string label)
{
var id = ImGui.GetID(label);
if (!SearchBoxStates.TryGetValue(id, out var state))
{
state = new SearchBoxState();
SearchBoxStates[id] = state;
}
return state;
}
static bool SearchBox(string label, ref string filter)
{
var state = GetSearchBoxState(label);
ImGui.PushID(label);
try
{
if (state.FocusNext)
{
ImGui.SetKeyboardFocusHere();
state.FocusNext = false;
}
ImGui.SetNextItemWidth(-1);
return ImGui.InputTextWithHint("##input", "Filter...", ref filter, 256);
}
finally
{
ImGui.PopID();
}
}
AddNewExtension<ImGuiContainerExtensions>().AddRenderer.ImGuiWindowManager.OpenNew.ICanBeDisplayedInImGui.recipes/bot-memory-imgui-interface.md.windows-subsystems/blazor-windows.md.osd/screen-overlay.md.scripting/references-and-resources.md.IImGuiExperimentalApi до добавления ImGuiContainerExtensions.ImGui.Begin окон, если есть manager.ImGuiEx.EyeAuras.ImGuiSdk, IImGuiExperimentalApi, ImGuiWindowManager,ImGuiWindowHost, ImGuiNewWindowArgs, ImGuiWindowCtx,ICanBeDisplayedInImGui, IImGuiWindowContent,IImGuiWindowContentPreBegin, ImGuiEx, ImGuiModule,ImGuiContainerExtensions, ImGuiExperimentalApi, ImGuiFontSpec,ImGuiFontRangeType, AddFont, ReplaceFont, RemoveFont,AddFontFromMemoryTTF, IScriptFileProvider,ImGui.GetID, ImGui.PushID, ImGui.PopID, GetOrAddState,ComboBoxEx, DropdownButton, ConfirmButton, TextField,TextFieldWithConfirmButtons, HotkeyEditor, ToggleButton,DisplayPropertyGrid, MarkdownBox, ImageRgba32, ImageFromUrl,AwesomeIcon, TextUnformattedOutlined, ImGuiExtensions,ImDrawListWorldExtensions, ColorExtensions.auras/overlays.mdrecipes/bot-memory-imgui-interface.mdwindows-subsystems/blazor-windows.mdosd/screen-overlay.mdreverse-engineering/reprocess.mdscripting/container-extensions.mdscripting/references-and-resources.md