Регистрация пользовательских оконных классов win32 из c #
=========================================================

У меня есть новое приложение, написанное на WPF, которое должно поддерживать старый API, который позволяет ему получать сообщение, которое было отправлено в скрытое окно. Обычно другое приложение использует FindWindow для идентификации скрытого окна, используя имя своего пользовательского класса окна.

**1) Я предполагаю, что для реализации пользовательского класса окна мне нужно использовать вызовы win32 старой школы?**

Мое старое приложение на c ++ использовало RegisterClass и CreateWindow, чтобы сделать самое простое невидимое окно.

Я считаю, что я должен быть в состоянии сделать то же самое в C #. Я неЯ не хочу, чтобы мой проект компилировал любой неуправляемый код.

Я попытался унаследовать от System.Windows.Interop.HwndHost и с помощью System.Runtime.InteropServices.DllImport, чтобы использовать вышеупомянутые методы API.

Благодаря этому я могу успешно разместить стандартное окно win32, например "ListBox» внутри WPF. Однако, когда я вызываю CreateWindowEx для моего собственного окна, оно всегда возвращает ноль.

Мой звонок в RegisterClass успешен, но я не уверен, что я должен установить для члена WNDCLASS.lpfnWndProc.

**2) Кто-нибудь знает, как это сделать успешно?**

 что трудности, с которыми я столкнулся, были связаны с проблемами сортировки строк. Я должен был быть более точным в моем импорте функций win32.

Ниже приведен код, который создаст пользовательский класс окна в C # - полезно для поддержки старых API, которые могут иметь пользовательские классы окна.

Он должен работать в WPF или Winforms, пока в потоке работает насос сообщений.

РЕДАКТИРОВАТЬ: Обновлено, чтобы исправить сообщенный сбой из-за раннего сбора делегата, который оборачивает обратный вызов. Делегат теперь сохраняется как член, а делегат явно маршалируется как указатель на функцию. Это устраняет проблему и облегчает понимание поведения.



 поместите определение в класс, а не функцию, и сбой будет исправлен.



В конструкторе, который я скопировал выше, есть небольшая ошибка: экземпляр WNDCLASS создается, но не сохраняется. В конечном итоге это будет мусор. Но WNDCLASS содержит делегата WndProc. Это приводит к ошибке, как только WNDCLASS является сборщиком мусора. Экземпляр WNDCLASS должен храниться в переменной-члене, пока окно не будет уничтожено.



**1)** Вы можете просто создать подкласс для обычного класса Windows Forms ... нет необходимости во всех этих вызовах win32, вам просто нужно вручную проанализировать сообщение WndProc ...

**2)** Вы можете импортировать пространство имен System.Windows.Forms и использовать его вместе с WPF.не будет никаких проблем, пока вы непереплетать слишком много оконных форм в вашем приложении WPF. Вы просто хотите создать свою скрытую форму, чтобы получить сообщение, верно?

Пример подкласса WndProc:

Поскольку вы уже знаете RegisterClass и все эти вызовы Win32, я предполагаю, что сообщение WndProc неэто не проблема для вас ...