UIAutomation делает это намеренно: приложения обычно ожидают получения ввода только тогда, когда они находятся в фокусе. Чтобы отправить ввод с клавиатуры, вы должны сначала сфокусировать его. Или, если вы нажмете на элемент управления, чтобы взаимодействовать с ним, он обычно получает фокус в результате щелчка, а затем выполняет действие. Есть некоторые приложения, которые очень запутываются (иногда вплоть до сбоя), если вы отправляете им ввод без предварительной отправки им фокуса.
(Эти приложения могут, например, инициализировать некоторое внутреннее состояние в WM_SETFOCUS и полагаться на то, что это состояние будет готово, когда они получат ввод. действительно быть инструментом, который отправляет «поддельные» входные данные, которые нарушают контракт здесь.)
С меню дело обстоит сложнее: во-первых, в Windows меню всегда присутствует только в приложении, которое имеет фокус. Таким образом, чтобы отобразить меню, приложение с меню должно иметь фокус, поэтому фокус должен переключиться с UISpy: это невозможно. Но реальная проблема с меню заключается не в том, что UIAutomation переключает фокус на приложение: щелчок по инструменту (UISpy) приводит к закрытию меню. Это не проблема UIAutomation — просто Win32 обрабатывает меню. Итак, реальный вопрос здесь заключается в следующем: как мне использовать инструмент для просмотра или иного управления меню, когда щелчок по инструменту закроет то самое меню, с которым я пытаюсь работать?
Есть несколько способов обойти это — оба из них Инструмент проверки объектов (inspect.exe) использует. Inspect.exe был старым MSAA-предшественником UISpy, но обновленная версия, доступная как часть SDK, теперь поддерживает как MSAA, так и UIAutomation. Следующие методы реализованы только в нескольких местах (например, SetFocus, команды навигации, но не Invoke.Invoke()), но вы можете использовать их в своем собственном инструменте по мере необходимости.
Он решает эту проблему, используя два подхода:
Горячие клавиши. Горячие клавиши сами по себе не изменяют фокус и не закрывают меню, поэтому используйте RegisterHotKey(), чтобы назначить горячую клавишу (например, Ctrl-Shift-X) для каждого действия, которое вы, возможно, захотите выполнить с текущим объектом. Теперь, когда целевое приложение находится в фокусе и присутствует меню, вы можете использовать комбинацию горячих клавиш, чтобы сигнализировать инструменту о выполнении соответствующего действия.
Креативное использование мыши: вы не можете использовать мышь, чтобы щелкнуть пользовательский интерфейс, но вы все равно можете воспользоваться положением мыши. Inspect имеет параметр «Активная панель инструментов при наведении» (в меню «Параметры»): если он выбран, если вы наведете указатель мыши на элемент панели инструментов на несколько секунд, он будет обрабатывать его так, как если бы он был нажат. Это позволяет вам перемещаться по пунктам меню, например, фактически не нажимая на какой-либо пользовательский интерфейс Inspect. Внутри, возможно, используется некоторая комбинация опроса и TB_HITTEST, чтобы выяснить, над какой кнопкой находится указатель.
Или вы можете использовать комбинацию из них: используйте горячую клавишу, чтобы вызвать команду в инструменте, над которой находится указатель мыши — в зависимости от того, что работает для вас.
person
BrendanMcK
schedule
20.02.2012