C# 如何在c中侦听来自DLL的消息#

C# 如何在c中侦听来自DLL的消息#,c#,forms,dll,listener,message,C#,Forms,Dll,Listener,Message,我有一个由标准win32 DLL控制的设备。设备响应通过应用程序窗口句柄发回(连接时需要)。 现在,我查看消息的唯一方法是覆盖表单中的WndProc,这是非常有限的 我的初衷是通过将所有内容都放在dll中,尽可能地将设备裸处理与应用程序隔离开来,但这种依赖性使我无法实现它 我需要某种钩子,它允许我查看表单(一个lawndproc)接收的消息,但是从我的dll。我所看到的只是同一表单中的钩子,而不是dll中的钩子 哦,顺便说一句,我知道钩子也是WPF兼容的,这也是这里的一个要求 任何想法都非常感谢

我有一个由标准win32 DLL控制的设备。设备响应通过应用程序窗口句柄发回(连接时需要)。 现在,我查看消息的唯一方法是覆盖表单中的WndProc,这是非常有限的

我的初衷是通过将所有内容都放在dll中,尽可能地将设备裸处理与应用程序隔离开来,但这种依赖性使我无法实现它

我需要某种钩子,它允许我查看表单(一个lawndproc)接收的消息,但是从我的dll。我所看到的只是同一表单中的钩子,而不是dll中的钩子

哦,顺便说一句,我知道钩子也是WPF兼容的,这也是这里的一个要求


任何想法都非常感谢

为什么不在从WndProc调用的DLL中添加一个方法呢

//In the DLL
public bool HandleMessage(/*args go here that I forget*/) {
    if(/*message is for me*/) {
        //handle it
        return true;
    }
    return false;
}

//in WndProc
if(MyObject.HandleMessage(/*args*/)) {
    return true;
}
//do whatever else

IMessageFilter只提供已发布的消息,而不提供已发送的消息。当然,如果设备代码坚持使用应用程序的主窗口,你几乎无能为力。您需要添加一个公共方法,让主应用程序告诉您其主窗口的句柄值。然后,您可以从NativeWindow派生自己的类,将该主窗口作为子类,并监视其消息。使用AssignHandle()方法并重写WndProc()以进行监听。确保对任何与设备无关的消息调用DefWndProc()。您还需要检测WM_CLOSE,以便可以取消对窗口的子类化,调用ReleaseHandle()。

不,这就是方法。当然没有理由不在DLL中创建表单实例。表单类和其他任何.NET类一样都是一个类。只要设备代码能够找到它,它就不必是一个可见的窗口。只有当窗口是应用程序的主要形式时,设备才会发送消息,因此必须使用application.Run创建它。使用ShowDialog运行或显示它,这就是我无法在类中隐藏、创建它或从中派生它的原因。我用wndprc试过了,消息就不再显示了。哦,顺便说一句,我尝试了IMessageFilter,它会因为没有特殊原因跳过几条消息。我尝试将代码与应用程序窗口隔离,因为我使用的并非所有设备都需要这种回调方法。该类实现了应用程序使用的标准接口,因此这将影响设计模式。谢谢你的建议,明白了!以防万一有人掉进这样的坑里。它可能很脏,但能用。我在dll中创建了一个控件类,并将其附加到实例化期间收到的主窗口。在我必须公开的控件类中,我插入了WndProc重写函数,以便将其附加到表单中。成功了!这是两个世界的混合,但它开始捕捉设备的消息从我的dll!谢谢大家的建议!在我结束这个问题之前,我得等几个小时。你的建议看起来是可行的。我要试一试。我让它与一个隐藏的控制,但它可能不会为WPF工作,所以我会尝试这个代替。非常感谢。马上返回结果…它也适用于WPF,它还使用常规的Windows窗口。只是有点麻烦去拿手柄。它起作用了。必须使用WindowInteropHelper从WPF窗口获取IntPtr,但除此之外,它是完美的。万分感谢!之前有人向我建议过这个替代方案,但它缺少AssignHandle要求,这显然是必要的。再次感谢你!