Обработка сообщений для окна от другого процесса

Я разрабатываю приложение 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() для выполнения фактического подкласса окна с использованием этого блока памяти как оконная процедура.

Другие вопросы по тегам