2016-07-08 10 views
0

фонДоступ к 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 будет включен на уровне по умолчанию.

Вопросы

  1. Есть ли способ обхода WPF иерархии виджетов из неуправляемого кода C++ внутри DLL? Предположительно, должен быть какой-то родной/неуправляемый API, который я мог бы назвать?
  2. В противном случае можно переадресовать HWND в другой процесс, скажем через WM_COPYDATA и скрытое окно, которое на самом деле является управляемым процессом, который затем может обрабатывать дерево виджетов от имени вложенной DLL, получая доступ к виджетам Win32, переключение на WPF по мере необходимости? Мое исследование показало бы, что это невозможно ...
  3. Будет ли у процесса разрешено делать (2) с включенным UAC?

Наконец-то я должен сказать, что я являюсь инженером-программистом Unix/Linux GUI/систем/инженером по фоновому режиму и заранее извиняюсь, если выше это кажется довольно простым, но я просто не мог найти ответы на это конкретное использование дело. Это также моя первая программа MS-Windows!

Большое спасибо,

John.

+0

Автоматизация Would UI (Linux эквивалент: ATK) будет лучшим решением твоя проблема? Я не совсем уверен *, что вам нужно проверить. – andlabs

+2

Что вы видите, это приложение, которое решило использовать элементы управления без окон. Это довольно распространено и не ограничивается 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

ответ

0

если вам нужно только, чтобы получать уведомления о создании окна и активации событий - лучший способ использования

SetWinEventHook(EVENT_OBJECT_CREATE, EVENT_OBJECT_DESTROY, 0, WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT); 

и WinEventProc искать idObject == OBJID_WINDOW & & idChild == CHILDID_SELF это абсолютное не зависит от WPF, и работать даже из процессов с низкой целостностью. также - вам не нужно вызывать EnumChildWindows здесь, потому что уведомлять работу для всех окон. не требуются отдельные DLLs 32/64бит, не нужно incjection, , например

VOID CALLBACK WinEventProc( HWINEVENTHOOK /*hWinEventHook*/, DWORD event, 
          HWND hwnd, LONG idObject, LONG idChild, DWORD /*dwEventThread*/, 
          DWORD /*dwmsEventTime*/) 
{ 
    if (event == EVENT_OBJECT_CREATE) 
    { 
     if (idObject == OBJID_WINDOW && idChild == CHILDID_SELF)// 
     { 
      WCHAR sz[256], cn[256]; 
      if (!GetWindowText(hwnd, sz, RTL_NUMBER_OF(sz))) 
      { 
       *sz = 0; 
      } 
      if (!GetClassNameW(hwnd, cn, RTL_NUMBER_OF(cn))) 
      { 
       cn[0]='?', cn[1]=0; 
      } 
      DbgPrint("%p <%S>::<%S>\n", hwnd, cn, sz); 
     } 
    } 
} 

для диалога настроек из МСВС следующий вывод:

0000000000040900 <#32770>::<> 
00000000000408FC <tooltips_class32>::<> 
00000000000408FE <SysTreeView32>::<> 
00000000000408FA <Button>::<Show &all settings> 
00000000000408F8 <Button>::<OK> 
00000000000408F6 <Button>::<Cancel> 
00000000000408F4 <Button>::<&Reset> 
00000000000508DC <Button>::<Apply> 
00000000000508DA <SysTabControl32>::<> 
000000000003090A <#32770>::<> 
000000000003090C <Button>::<&Reuse current document window, if saved> 
000000000003090E <Button>::<&Detect when file is changed outside the environment> 
0000000000030910 <Button>::<Auto-&load changes, if saved> 
0000000000030912 <Button>::<Allo&w editing of read-only files; warn when attempt to save> 
0000000000030914 <Button>::<&Open file using directory of currently active document> 
0000000000030916 <Button>::<Chec&k for consistent line endings on load> 
00000000001F08AA <Button>::<Displa&y warning when global undo will modify edited files> 
0000000000260336 <Button>::<&Show Miscellaneous files in Solution Explorer> 
00000000001D08A6 <Static>::<items saved in the &Miscellaneous files project> 
00000000001208A4 <Edit>::<> 
00000000001408AE <Button>::<Save documents as &Unicode when data cannot be saved in codepage> 
+0

Извините за поздний ответ, отвлекшись на более приоритетную работу. Большое спасибо за ваш ответ, это намного проще и более гуляет по виджетным деревьям. Благодаря :-). –