InvokePattern.Invoke не активирует кнопку Access/VBA, когда окно находится на дополнительном монитореC#

Место общения программистов C#
Ответить
Anonymous
 InvokePattern.Invoke не активирует кнопку Access/VBA, когда окно находится на дополнительном мониторе

Сообщение Anonymous »

Справочная информация. У меня есть клиент автоматизации C# (.NET Framework 4.8), использующий System.Windows.Automation для вызова кнопки в приложении Microsoft Access (VBA). Целевой элемент управления нестандартный/безоконный (

Код: Выделить всё

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 — они все идентичны в обоих случаях
  • Код: Выделить всё

    SetForegroundWindow(topHwnd)
    и button.SetFocus()
  • Код: Выделить всё

    AutomationElement.FromPoint(clickablePoint)
    и вызовите для этого элемента.
  • Код: Выделить всё

    AttachThreadInput
    + SetForegroundWindow перед вызовом
  • Код: Выделить всё

    LegacyIAccessiblePattern.DoDefaultAction
    через отражение (тип недоступен в моей среде выполнения)
  • В качестве запасного варианта я использовал SendInput для имитации реального щелчка мыши — это надежно вызывает нажатие кнопки
Наблюдения
  • Код: Выделить всё

    InvokePattern.Invoke
    выполняется без выбрасывания в обоих сценариях
  • Код: Выделить всё

    Element.Current.NativeWindowHandle == 0
    (безоконный элемент управления) — SendMessage(BM_CLICK) в элемент управления невозможен
  • Элемент управления доступен UIA, но, видимо, провайдер/цель не выполняет действие, когда окно находится на вторичном мониторе
Вопросы
  • Кто-нибудь сталкивался InvokePattern.Invoke возвращается нормально, но не оказывает никакого эффекта, когда цель находится на другом мониторе (несколько мониторов)?
  • Известны ли проблемы поставщика доступа UIA/MS с элементами управления без окон или настройками нескольких мониторов?
  • Какую дополнительную диагностику вы бы порекомендовали (ETW, UIA Verifier, проверки MSAA, определенные свойства для сравнить)?
  • Существуют ли какие-либо «чистые» альтернативы (без перемещения мыши) для надежного запуска действий управления без окон Access/VBA?


Подробнее здесь: https://stackoverflow.com/questions/798 ... s-on-secon
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»