Обработка сообщений для окна от другого процесса
Я разрабатываю приложение C# WPF, которое перерисовывает главное окно другого приложения, используя вызов Win32 SetParent(). Дескриптор этого дочернего окна вне процесса заключен в класс с именем FormHost, который является производным от HwndHost. Все работает хорошо, за исключением одного: сообщения для восстановленного окна не доставляются в FormHost. В документации MSDN четко сказано, что оконная процедура HwndHost WndProc() не может использоваться с внешними окнами. Альтернатива MessageHook тоже не работает. Я также попытался вызвать AttachThreadInput(), чтобы объединить обработку ввода двух окон. Неудачно. Какие-либо предложения?
1 ответ
Процесс, который переопределяет окно, не может напрямую разделить процедуру сообщения вне окна процесса. Он должен будет внедрить свой собственный код оконной процедуры в адресное пространство процесса-владельца окна, создать подкласс окна в этом адресном пространстве, а затем, наконец, использовать выбранный вами механизм IPC для обратной связи с процессом родительского контроля при необходимости.
Для фактической инъекции вы можете:
1) поместите фактический код оконной процедуры в DLL, используйте CreateRemoteThread(), чтобы загрузить DLL в процесс владения окном, и затем подкласс DllEntryPoint () библиотеки DLL в окне (вам нужно будет где-то хранить дескриптор HWND в глобальной памяти так что DLL может найти его).
2) поместить фактический код оконной процедуры в блок памяти, выделенный в адресном пространстве процесса владения окном, используя VirtualAllocEx() и WriteProcessMemory(), затем использовать CreateRemoteThread() для выполнения фактического подкласса окна с использованием этого блока памяти как оконная процедура.