我有一个由标准win32 dll控制的设备。设备响应通过应用程序窗口句柄发送回来(连接时需要)。 现在,我必须查看消息的唯一方法是覆盖表单中的WndProc,这是非常有限的。
我的初衷是通过将所有内容放在dll中来尽可能地将设备裸露处理与应用程序隔离,但这种依赖性使我无法实现它。
我需要某种钩子,这样我就可以查看Form(la WndProc)收到的消息,但是我的dll。我所看到的只是在同一个表单中显示钩子,而不是来自dll。
哦,顺便说一下,我也知道钩子也兼容WPF,这也是一个要求。
非常感谢任何想法!
答案 0 :(得分:1)
IMessageFilter仅为您提供已发布的消息,而不是已发送的消息。如果设备代码坚持使用应用程序的主窗口,那么当然没有什么可以做的。您需要添加一个公共方法,让主应用程序告诉您它的主窗口的句柄值是什么。然后,您可以从NativeWindow派生自己的类,以继承该主窗口并监视其消息。使用AssignHandle()方法并覆盖WndProc()以窥探。请务必为任何与设备无关的消息调用DefWndProc()。您还需要检测WM_CLOSE,以便可以取消子类化窗口,调用ReleaseHandle()。
答案 1 :(得分:0)
为什么不在你从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