如何创建C#事件来处理来自PostMessage()的MFC Windows消息

我有一个使用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 Forms应用程序中的这个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#app来处理数据包。 如果最小化,C#Forms窗口是否仍然会收到这些消息?

  3. 有一个更好的方法吗?

找到了如何在这里创建事件处理程序的答案
您只需覆盖Form.WndProc()虚方法,测试特定的自定义消息ID,并将所有其他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); } 

测试显示最后一个问题的答案是肯定的。 即使Form最小化,也会发送和处理消息。