фонДоступ к WPF из неуправляемого C++ код
В настоящее время я пытаюсь разработать некоторые тестовое программное обеспечение, которое должно быть уведомлен о создании окна и активации событий через рабочий стол, реагировать на них и ходить виджет деревья чтобы прочитать весь доступный текст в этих окнах. Это должно работать через 32-битное и 64-битное, а от XP - идеально (вздох), но, конечно, 7 вверх.
Что я сделал So Far
У меня рабочий системный хук SetWindowsHookEx()
стиля зарегистрированного WH_CBT
сообщений, и я специально обрабатывать HCBT_ACTIVATE
и HCBT_CREATEWND
события. Крючок выполняется в DLL, и есть управляющая программа, которая управляет им. Программа доступна и работает как для 32-битного, так и для 64-битного (поскольку сообщения HCBT
, похоже, не перенаправляются на процесс подключения для разных архитектур (32/64 бит), в отличие от сообщений клавиатуры). Программное обеспечение написано на неуправляемом C++-коде, то есть нет зависимости от CLI, а программа - консольное приложение.
Когда я получаю одно из двух вышеуказанных событий, я звоню EnumChildWindows()
с данным дескриптором HWND
и звоню GetWindowText()
на каждое окно. Результаты в настоящее время записываются в отдельные файлы журналов на основе PID.
Это все работает, как ожидалось, но только заходит так далеко ...
Проблема
Если я подбежать сказать МСВС я могу видеть, верхний материал уровня и даже текстовое содержимое `вы уверены, что хотите сделать это« простые диалоговые окна предупреждения », но для диалога параметров все, что я получаю, это виджеты« ОК »и« Отмена »и несколько невыделенных окон.
Считаю, что причина в том, что я вижу переход от виджеты старой школы Win32 API к виджетам управления WPF.
Предположения/Требования
- Это связано с Win32 в WPF перехода.
- Будучи крючком стиля
SetWindowsEx()
, вводимым в каждый процесс из DLL, это должен быть неуправляемый код (т. Е. Вы не можете запустить CLI внутри какого-либо случайного процесса и использовать управляемый код). - В примерах библиотеки WPF используется управляемый код.
- Было замечено, что некоторые приложения не используют API доступности и поэтому подключаются, что было уценено мной.
- Мне нужно как можно меньше сократить зависимости, так как тестируемые системы должны быть как можно более репрезентативными (я знаю, что я вводил код повсюду, но это не может помочь). Я не хочу устанавливать дополнительные большие промежутки времени и т. Д., Если я могу помочь.
- Во время тестирования UAC будет включен на уровне по умолчанию.
Вопросы
- Есть ли способ обхода WPF иерархии виджетов из неуправляемого кода C++ внутри DLL? Предположительно, должен быть какой-то родной/неуправляемый API, который я мог бы назвать?
- В противном случае можно переадресовать
HWND
в другой процесс, скажем черезWM_COPYDATA
и скрытое окно, которое на самом деле является управляемым процессом, который затем может обрабатывать дерево виджетов от имени вложенной DLL, получая доступ к виджетам Win32, переключение на WPF по мере необходимости? Мое исследование показало бы, что это невозможно ... - Будет ли у процесса разрешено делать (2) с включенным UAC?
Наконец-то я должен сказать, что я являюсь инженером-программистом Unix/Linux GUI/систем/инженером по фоновому режиму и заранее извиняюсь, если выше это кажется довольно простым, но я просто не мог найти ответы на это конкретное использование дело. Это также моя первая программа MS-Windows!
Большое спасибо,
John.
Автоматизация Would UI (Linux эквивалент: ATK) будет лучшим решением твоя проблема? Я не совсем уверен *, что вам нужно проверить. – andlabs
Что вы видите, это приложение, которое решило использовать элементы управления без окон. Это довольно распространено и не ограничивается WPF. Все приложения Qt используют элементы управления без окон и большинство браузеров. Посмотрите на иерархию окон Internet Explorer с помощью Spy ++. Там мало что можно увидеть. Вам действительно нужно [WinEvents] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd373889.aspx) и [Автоматизация пользовательского интерфейса] (https://msdn.microsoft.com/ru -us/библиотека/окно/настольный/ee684009.aspx). – IInspectable