2009-08-05 3 views
0

Я создаю подкласс NativeWindow ('MyNativeWindow'), чтобы использовать свой насос сообщений для связи с какой-то старой DLL. Мой код запускается внутри приложения WinForms, но я хочу, чтобы DLL и обработка сообщений выходили за рамки GUI.Проблема с NativeWindow, построенная в контексте потока

При создании MyNativeWindow из контекста приложения (непосредственно перед созданием основной формы приложения) все работает - вызывается WndProc NativeWindow и обрабатываются события. Однако, когда я использую поток для инициализации MyNativeWindow, кажется, что насос сообщения не будет работать.

Есть ли какие-либо ограничения на создание NativeWindow?

ответ

3

Я не уверен, что вы ожидаете здесь, поэтому я не уверен, смогу ли я полностью ответить вам. В NativeWindow нет насоса сообщений. Это просто подклассы существующего окна, заменив его оконную процедуру. Когда насос сообщений потока передает сообщение для этого окна, он переходит к процедуре окна подкласса NativeWindow, а не к процедуре исходного окна. Если подкласс не обрабатывает его, он должен быть перенаправлен на процедуру исходного окна.

Я подозреваю, что вы создаете окно, а затем подкласс NativeWindow на вторичном потоке, но вы не создаете насос сообщений в этом потоке. Таким образом, никакие сообщения не обрабатываются. Если вы хотите создать насос сообщений на вторичном потоке и не позволять ему просто выйти, вы должны создать окно, а затем вызвать некоторую форму Application.Run в этом потоке. Затем вы можете подклассифицировать это окно и получать сообщения.

+0

+1 за окном не имеет MessagePump. –

0

Вам также нужно запустить насос сообщений, создав NativeWindow, это не делает AFAIK.

Shameless вилка: попробуйте backgrounder, и сделать что-то вроде:

BackgroundHelper helper = new BackgroundHelper(); 
helper.Background(() => { 
    MyNativeWindow receiver = new MyNativeWindow(); 
}); 

И посмотрите, что работает из коробки.

(Если нет, не стесняйтесь приставать меня в системе отслеживания проблем :-).)

Смежные вопросы