(順便說一句,這是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接口,它的工作原理,直到我移動窗體,並由於某種原因,消息停止流向對象...? –