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

本文关键字:DLL 消息 | 更新日期: 2023-09-27 18:01:05

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

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

我需要某种钩子,它可以让我窥探表单(一个la WndProc(收到的消息,但来自我的dll。我所看到的都显示了来自同一表单中的钩子,而不是来自dll。

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

任何想法都非常感谢!

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

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

为什么不在从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