(これは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インターフェイスを試してみましたが、何らかの理由でメッセージがオブジェクトに流れなくなりました...? –