【发布时间】:2017-09-08 12:00:32
【问题描述】:
(顺便说一句,这是 C# .NET 4.5)
我有一些与某些硬件通信的非托管 DLL。我包装了一堆代码,得到了一些简单的东西,作为一个类对象,我可以在 WinForm 中创建。
private AvaSpec AS = new AvaSpec();
public AvaSpec_Form()
{
InitializeComponent();
AS.SpectrumMeasuredEvent += (se, ev) => { SpectrumMeasured(ev); };
AS.Init(this.Handle);
AS.Activate();
// configure as desired
// AS.l_PrepareMeasData.m_IntegrationDelay = 0;
if (AS.DeviceList.Count > 0)
{
AS.Start();
}
}
但是,DLL 依赖于通过 WndProc 接收消息。我能想到的最好方法是在 Form 上重载 WndProc 方法:
protected override void WndProc(ref Message m)
{
// catch WndProc messages that AvaSpec defines as its own
if (m.Msg == AvaSpec.WM_MEAS_READY ||
m.Msg == AvaSpec.WM_APP ||
m.Msg == AvaSpec.WM_DBG_INFOAs ||
m.Msg == AvaSpec.WM_DEVICE_RESET )
{
AS.WndProcMessageReceived(ref m);
}
// else pass message on to default message handler
base.WndProc(ref m);
}
如何在类定义中以某种方式隐藏此重载,以便不需要将重载方法添加到表单本身?有一些关于 IMessageFilter 接口的讨论,但它看起来仍然需要表单中的一些代码来添加过滤器。关于如何使它更优雅的任何想法?
【问题讨论】:
-
没有什么可隐藏的,它与您覆盖的原始 Form.WndProc() 一样可见并受到保护。
-
顺便说一句,我尝试了 IMessageFilter 接口,它可以工作,直到我移动表单,并且由于某种原因消息停止流向对象...?
标签: c# dll filter unmanaged wndproc