(顺便说一句,这是C#.NET 4.5)WndProc重载+非托管DLL包装:更好的方式?
我有一些非托管的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接收消息。我能想出要做到这一点,最好的办法是重载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接口,它的工作原理,直到我移动窗体,并由于某种原因,消息停止流向对象...? –