2011-07-05 12 views
0

標準のwin32 dllで制御されているデバイスがあります。デバイスの応答は、アプリケーションウィンドウハンドル(接続時に必要)を介して返されます。 今、私がメッセージを見なければならない唯一の方法は、フォーム内のWndProcをオーバーライドすることです。これは非常に限定的です。CでDLLからのメッセージを聞くにはどうすればいいですか#

私の元の意図は、dllの中にすべてを置くことによって、デバイスの裸の取り扱いをアプリケーションからできるだけ分離することでしたが、この依存関係は私がそれを達成できないようにしています。

フォーム(a la WndProc)ではなく、私のdllから受け取ったメッセージを見ることができるフックが必要です。私が見たのは、dllからではなく、同じ形式のフックを示しています。

ああ、ところで、私はフックもWPFと互換性があることを理解しており、これもここでの要件です。

ご意見は大変ありがとうございます。

+0

いいえ、それはそれを行う方法です。確かに、DLLにフォームインスタンスを作成できない理由はありません。そして、フォームクラスは他の.NETクラスのような単なるクラスです。それは、デバイスコードがそれを見つけることができる限り、可視ウィンドウである必要はありません。 –

+0

ここに事があります。このデバイスは、ウィンドウがアプリケーションのメインフォームである場合にのみメッセージを送信するため、Application.Runを使用して作成するか、ShowDialogを使用して表示する必要があります。そのため、非表示にしたり、作成したり、クラス。 wndprcを使って試してみたところ、メッセージが表示されなくなりました。ああ、ところで、私はIMessageFilterを試してみました。何の理由もなく2つのメッセージをスキップします。 –

答えて

1

IMessageFilterは送信メッセージのみを送信し、送信メッセージは送信しません。デバイスのコードがアプリのメインウィンドウの使用を主張している場合は、もちろんほとんどできません。メインアプリケーションがメインウィンドウのハンドル値を教えてくれるようにするには、パブリックメソッドを追加する必要があります。 NativeWindowから独自のクラスを派生させて、メインウィンドウをサブクラス化し、そのメッセージを偵察することができます。 AssignHandle()メソッドを使用し、WndProc()をオーバーライドしてスヌープします。 DefWndProc()を呼び出すと、デバイス関連ではないメッセージが表示されます。ウィンドウのサブクラスを解除できるようにWM_CLOSEも検出する必要があり、ReleaseHandle()を呼び出します。

+0

あなたの提案は、行く方法に見えるものです。私はそれを試してみましょう。私はそれを隠されたコントロールで動作させましたが、WPFのためにはうまくいきませんので、代わりにこれを試してみます。ありがとうございました!結果と一緒に戻ってください... –

+0

これはWPFでも同様に動作し、通常のWindowsウィンドウも使用します。ハンドルを手に入れるのはちょっと面倒です。 –

+0

それは働いた。 WPFウィンドウからIntPtrを取得するためにWindowInteropHelperを使用しなければならなかったが、それに加えて完全なものだった。感謝万円!この代替案について私は前にアドバイスを受けていましたが、明らかに不可欠だったAssignHandle要件が不足していました。再びありがとう! –

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 
+0

私はこの種のコールバック方法論を使用しているデバイスのすべてではないので、アプリケーションウィンドウからコードを分離しようとしています。このクラスは、アプリケーションによって消費される標準インタフェースを実装しているため、これが設計パターンに影響します。しかし、提案をありがとう。 –

+0

誰かがこの種の穴に落ちた場合に備えて。それは汚れているかもしれませんが、機能します。 私はdll内にControlクラスを作成し、それをインスタンス化中に受け取ったメインウィンドウにアタッチしました。フォームに添付するために私が公開しなければならなかったControlクラス内に、WndProcオーバーライド関数を挿入しました。出来た!それは両方の世界のミックスですが、それは私のdllを使って、デバイスのメッセージをキャプチャし始めました! ありがとうございます。 私はこの質問を閉じる前に数時間待たなければならない –

関連する問題