AI Windows — дескрипторы окон
AI-first карта дескрипторов окон, селекторов, матчеров и провайдеров.
Карта API по HWND, сопоставлению и отслеживанию окон
Справочная карта по нативным дескрипторам окон, преобразованию сырого HWND, перечислению окон, сопоставлению, отслеживанию foreground-окна и изменений границ окна.
Интерактивный выбор окна описан в osd/selection.md.
Что обычно нужно сделать
- Преобразовать сырой
HWND/IntPtrвIWindowHandle. - Прочитать для окна process id, title, bounds, owner, parent и visibility.
- Перечислить известные окна.
- Сопоставлять окна по title, process, path, handle или выражению.
- Поддерживать живой выбор целевого окна.
- Отслеживать foreground window или изменения bounds.
Модель сущностей
IWindowHandle— это обёртка PoeShared над нативным окном.IWindowHandleProviderпреобразует сырые handle в обёртки.IWindowListProviderотвечает за живое перечисление, ignored windows, blacklists и определение foreground window.IWindowMatcherвыполняет stateless-сопоставление по выражению.IWindowSelectorхранит stateful active target на основе match expression.IWindowHandleMatcherиIComplexWindowHandleMatcher— это инфраструктурные include/exclude predicates.- Трекеры foreground и bounds работают поверх нативных event hooks.
Детали API
-
PoeShared.Native.IWindowHandle- Используйте
Handleтолько там, где действительно нужен сыройIntPtr. - Вместо повторных Win32-запросов предпочитайте
ProcessId,ProcessName,Title,Boundsи метаданные owner/parent/state.
- Используйте
-
PoeShared.Native.IWindowHandleProviderGetByWindowHandle(IntPtr hwnd)преобразует сырой handle.GetMonitorByWindowHandle(IntPtr hwnd)определяет monitor context.- Не занимается выбором или перечислением окон.
-
IWindowListProviderAllWindowList,WindowList,IgnoredWindows,BlacklistedWindows.ResolveByHandle(IntPtr),GetForegroundWindow(),RefreshWindowList().
-
IWindowMatcherIsMatch(...)иFindMatches(...)дляWindowMatchExpression.
-
IWindowSelectorTargetWindow,ActiveWindow,MatchingWindowList,OnlyVisible,WindowFilter.- Используйте, когда коду нужно постоянное выбранное целевое окно, которое следует за match expression.
-
WindowSelectorExtensionsFindWindow(...)устанавливаетTargetWindowи возвращает выбранноеActiveWindow, либоnull, если совпадений нет.GetWindow(...)устанавливаетTargetWindowи возвращает выбранноеActiveWindow; используйте его, когда отсутствие окна считается исключительной ситуацией.- Используйте
TargetWindowвместе сActiveWindow, если отсутствие окна ожидаемо и его нужно обрабатывать без исключений, при этом коду важно сохранить состояние selector. - Используйте
IWindowMatcher.FindMatches(...), если коду намеренно нужны несколько совпадений или сопоставление по переданному списку.
-
WindowHandleExtensionsActivate(...)выводитIWindowHandleна передний план.Activate(...)делегирует вызов вUnsafeNative.ActivateWindow(...).ToWindowMatchExpressionOrDefault(...)создаёт переиспользуемое match expression из известного handle окна.
-
UnsafeNative.ActivateWindow(...)- Низкоуровневый helper для активации с overload-ами для
IntPtr,IWindowHandle, timeout и log. - Перед активацией восстанавливает свёрнутые окна и ждёт переключения foreground window.
- Выбрасывает исключение, если целевое окно не стало foreground до истечения timeout.
- В примерах для скриптов и документации предпочтительнее
WindowHandleExtensions.Activate(...).
- Низкоуровневый helper для активации с overload-ами для
-
IForegroundWindowTracker,IWindowTracker- Отслеживание foreground/active window.
-
IWindowBoundsTrackerFactory- Отслеживает изменения прямоугольника окна.
Типовые сценарии
-
Сырой handle в обёртку:
- получите
IntPtr hwnd; - вызовите
IWindowHandleProvider.GetByWindowHandle(hwnd); - передайте дальше
IWindowHandle.
- получите
-
Постоянный выбор целевого окна:
- получите
IWindowSelector; - установите
TargetWindow; - читайте
ActiveWindowиMatchingWindowList.
- получите
-
Поиск одного целевого окна:
- получите
IWindowSelector; - вызывайте
FindWindow(...), если отсутствие окна ожидаемо и должно обрабатываться без исключения; - вызывайте
GetWindow(...)только если отсутствие окна — исключительная ситуация; - используйте
TargetWindowвместе сActiveWindow, если коду нужно постоянное состояние selector; - сохраняйте возвращённый
IWindowHandle, а не запрашивайте окно повторно по сырому handle или строке.
- получите
-
Несколько совпадений или stateless-запрос:
- получите
IWindowListProviderиIWindowMatcher; - прочитайте
WindowsProvider.WindowList.Items; - вызовите
IWindowMatcher.FindMatches(..., targetExpression).
- получите
-
Одноразовая проверка "окно активно":
- получите
IWindowListProviderиIWindowMatcher; - вызовите
IWindowListProvider.GetForegroundWindow(); - вызовите
IWindowMatcher.IsMatch(foregroundWindow, targetExpression).
- получите
-
Активация найденного окна:
- получите
IWindowSelector; - вызывайте
FindWindow(...), если сценарий с отсутствующим окном должен обрабатываться явно; - вызывайте
GetWindow(...)только если отсутствие окна — исключительная ситуация; - вызовите
Activate(...)у handle.
- получите
-
Базовые правила
WindowMatchExpression:- обычный текст сопоставляется с process path, process name или title;
- текст в кавычках — строгое совпадение;
/pattern/— это regex;0x...или&H...сопоставляется с нативным handle;#2выбирает второе подходящее окно;&&и||объединяют более простые выражения;- свойства вроде
[type=toplevel],[type=child],[visible]и[focus]дополнительно ограничивают сопоставление.
-
Отслеживание bounds:
- получите
IWindowBoundsTrackerFactory; - вызовите
Track(window); - освободите subscription вместе с lifetime владельца.
- получите
Что предпочтительно использовать
- Предпочитайте
IWindowHandleпосле выбора/разрешения окна. - Используйте
IWindowHandleProviderтолько для преобразования сырого handle. - Для живого сопоставления целевого окна предпочитайте
IWindowSelector. - Для поиска одного окна без исключений предпочитайте
IWindowSelector.FindWindow(...). IWindowSelector.GetWindow(...)используйте только когда отсутствие окна — исключительная ситуация.- Для сопоставления нескольких окон, работы с переданными списками или проверок active window без изменения состояния selector предпочитайте
IWindowMatcherвместе сIWindowListProvider. - Для простых операций с окнами предпочитайте прямые API, работающие с window handle.
- Вместо сырых native event hooks предпочитайте trackers.
Чего лучше избегать
- Не храните сырой
IntPtrкак долгоживущий контракт. - Не используйте
IWindowHandleProviderкак selector или enumerator. - Не используйте aura Actions, Triggers или Overlays как лёгкие обёртки для простых script/API-операций. Это stateful-объекты runtime Aura Tree со своей конфигурацией и lifecycle.
- Не копируйте AutoHotkey
WinTitletokens вродеahk_exeилиahk_classнапрямую вWindowMatchExpression; переносите их осознанно. - Не считайте активацию гарантированной: foreground activation может завершиться по timeout или быть заблокирована Windows.
- Не пишите прямой низкоуровневый WinEvent code, если уже есть trackers.
Опорные сущности для поиска
IWindowHandle,IWindowHandleProvider,IWindowListProvider,IWindowMatcher,IWindowSelector,WindowMatchExpression,WindowSelectorExtensions,WindowHandleExtensions,UnsafeNative.ActivateWindow,IWindowHandleMatcher,IComplexWindowHandleMatcher,IForegroundWindowTracker,IWindowBoundsTrackerFactory,IWinEventHookWrapper.
Поисковые синонимы
- HWND
- IntPtr window handle
- window handle wrapper
- window selector
- window matcher
- foreground window
- active window
- target window
- window exists
- WinExist
- WinActive
- WinActivate
- window bounds tracker
- WinEvent hook
Связанные карты
osd/selection.mdosd/screen-overlay.mdwindows-subsystems/input-hooks-hotkeys.mdmemory/processes.md