3

WINSOCK を使用するマネージ C++ DLL があります。受信すると、PostMessage() を介してカスタム メッセージを CWnd * に送信します。これは、アンマネージ C++ から呼び出された場合に正常に機能します。ターゲット CWnd * は、次のコードを使用した構築後に C++ クラスに登録されます。

// Registers a window (CWnd *) to receive a message when a valid
// incoming data packet is received on this UdpRetrySocket. 
void CUdpRetrySocket::RegOnReceive(CWnd *i_pOnReceiveWnd, UINT i_RecvMsgId = WM_USER_RECV_DATA_AVAIL)
{
    m_pOnReceiveWnd = i_pOnReceiveWnd;
    m_RecvMsgId = i_RecvMsgId;
}

メッセージを CWnd に投稿するコードは次のとおりです *

// If there is a pending incoming packet and there is a window
// registered for receive notification then post a message to it.
if (m_bInPktPending && m_pOnReceiveWnd != NULL)
    m_pOnReceiveWnd->PostMessage(m_RecvMsgId,
                                 (WPARAM)m_RecvSocket.LocalSockAddrIn().Port(),
                                 (LPARAM)this
                                );

現在、C# Windows フォーム アプリケーションからこの CUdpRetrySocket クラスを使用しています。質問:

  1. C# Forms クラスから CWnd * を取得して C++ CUdpRetrySocket クラスに登録する方法

    ここで答え#1を見つけました

// C++ Register Window Method
void RegOnReceive(System::IntPtr i_Hwnd)
   { m_pOnReceiveWnd = CWnd::FromHandle((HWND)i_Hwnd.ToPointer()); }

// C# Caller of Register Window Method
class MyForm : Form
{
    . . .
    cmdDev.RegOnReceive(Handle);
  1. C# ウィンドウでイベントを作成して、このカスタム MFC スタイル メッセージをキャプチャするにはどうすればよいですか?

  2. ウィンドウが最小化されている場合でも、パケットを処理するには C# アプリが必要です。C# フォーム ウィンドウは、最小化されている場合でもこれらのメッセージを受け取りますか?

  3. これを行うより良い方法はありますか?

4

1 に答える 1

1

イベント ハンドラーの作成方法に対する回答が見つかりましたここでは、 Form.WndProc
() 仮想メソッドをオーバーライドし、特定のカスタム メッセージ ID をテストし、他のすべてを処理のために基本クラスに渡します。

protected override void WndProc(ref System.Windows.Forms.Message message)
{
    if (message.Msg == MY_CUSTOM_WINDOW_MSG_ID)
    {
        // PROCESS EVENT HERE
    }            
    base.WndProc(ref message);
}

テストの結果、最後の質問に対する答えは YES であることがわかりました。フォームが最小化されている場合でも、メッセージは送信および処理されます。

于 2012-06-21T00:42:37.127 に答える