Код: Выделить всё
AutomationElement.Current.NativeWindowHandle == 0Проблема: InvokePattern.Invoke() выполняется без исключений, и диагностика UIA выглядит одинаково, когда целевое окно находится на одном и том же мониторе, и когда оно находится на дополнительном мониторе. Однако, когда окно Access находится на дополнительном мониторе, кнопка фактически не выполняет свое действие, хотя Invoke() завершился нормально. Когда окно находится на том же мониторе, действие выполняется должным образом.
Среда
- .NET Framework 4.8
- Ссылки: UIAutomationClient, UIAutomationTypes
- Целевое приложение: Microsoft Access (VBA), элементы управления без окон
- ОС: Windows 10/11 (несколько мониторов, возможно, разрешение каждого монитора)
Код: Выделить всё
public void ClickButton(AutomationElement button)
{
object patternObj;
if (button.TryGetCurrentPattern(InvokePattern.Pattern, out patternObj))
{
InvokePattern invokePattern = patternObj as InvokePattern;
if (invokePattern != null)
{
invokePattern.Invoke();
Application.DoEvents();
Thread.Sleep(200);
}
}
}
Код: Выделить всё
=== Diagnostics start ===
IsOffscreen: False
IsEnabled: True
HasKeyboardFocus: False
BoundingRectangle: 0;23;109;24
NativeWindowHandle: 0x0
Supported patterns: InvokePatternIdentifiers.Pattern
TryGetClickablePoint: True -> 54,5;35
Top-level window hwnd: 0x2046A
Foreground window hwnd: 0x2046A
InvokePattern invoked — check whether the button was activated.
=== Diagnostics end ===
Код: Выделить всё
=== Diagnostics start ===
IsOffscreen: False
IsEnabled: True
HasKeyboardFocus: False
BoundingRectangle: 0;23;109;24
NativeWindowHandle: 0x0
Supported patterns: InvokePatternIdentifiers.Pattern
TryGetClickablePoint: True -> 54,5;35
Top-level window hwnd: 0x2046A
Foreground window hwnd: 0x2046A
InvokePattern invoked — check whether the button was activated.
=== Diagnostics end ===
- Verified IsOffscreen, BoundingRectangle, TryGetClickablePoint — они все идентичны в обоих случаях
- и button.SetFocus()
Код: Выделить всё
SetForegroundWindow(topHwnd) - и вызовите для этого элемента.
Код: Выделить всё
AutomationElement.FromPoint(clickablePoint) - + SetForegroundWindow перед вызовом
Код: Выделить всё
AttachThreadInput - через отражение (тип недоступен в моей среде выполнения)
Код: Выделить всё
LegacyIAccessiblePattern.DoDefaultAction - В качестве запасного варианта я использовал SendInput для имитации реального щелчка мыши — это надежно вызывает нажатие кнопки
- выполняется без выбрасывания в обоих сценариях
Код: Выделить всё
InvokePattern.Invoke - (безоконный элемент управления) — SendMessage(BM_CLICK) в элемент управления невозможен
Код: Выделить всё
Element.Current.NativeWindowHandle == 0 - Элемент управления доступен UIA, но, видимо, провайдер/цель не выполняет действие, когда окно находится на вторичном мониторе
- Кто-нибудь сталкивался InvokePattern.Invoke возвращается нормально, но не оказывает никакого эффекта, когда цель находится на другом мониторе (несколько мониторов)?
- Известны ли проблемы поставщика доступа UIA/MS с элементами управления без окон или настройками нескольких мониторов?
- Какую дополнительную диагностику вы бы порекомендовали (ETW, UIA Verifier, проверки MSAA, определенные свойства для сравнить)?
- Существуют ли какие-либо «чистые» альтернативы (без перемещения мыши) для надежного запуска действий управления без окон Access/VBA?
Подробнее здесь: https://stackoverflow.com/questions/798 ... s-on-secon
Мобильная версия