0

我正在创建一个 NativeWindow 子类('MyNativeWindow'),以便使用它的消息泵与一些旧的 DLL 进行通信。我的代码在 WinForms 应用程序中运行,但我想将 DLL 及其消息处理保留在 GUI 范围之外。

从应用程序上下文创建 MyNativeWindow 时(就在创建应用程序的主窗体之前),一切正常 - 调用 NativeWindow 的 WndProc 并处理事件。但是,当我使用线程初始化 MyNativeWindow 时,消息泵似乎不会运行。

NativeWindow的创建有什么限制吗?

4

2 回答 2

3

我不确定您期望在这里发生什么,所以我不确定我是否可以完全回答您。NativeWindow 没有消息泵。它只是通过替换现有窗口的窗口过程来对现有窗口进行子类化。当线程的消息泵为该窗口传递消息时,它会转到 NativeWindow 子类窗口过程,而不是原始窗口过程。如果子类不处理,就应该转发给原来的窗口过程。

我怀疑您正在创建窗口,然后在辅助线程上创建 NativeWindow 子类,但您没有在该线程上创建消息泵。因此,不会处理任何消息。如果您希望在辅助线程上创建一个消息泵,并防止它简单地退出,您必须创建窗口,然后在该线程上调用某种形式的 Application.Run。然后,您可以对窗口进行子分类并接收消息。

于 2009-08-05T15:24:42.767 回答
0

您还需要启动消息泵,创建 NativeWindow 并不能做到这一点。

无耻插件:尝试backgrounder,并执行以下操作:

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

看看这是否开箱即用。

(如果没有,请随时在问题跟踪器中纠缠我:-)。)

于 2009-10-14T22:46:01.847 回答