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

时间:2012-06-20 18:27:35

标签: c# visual-c++ postmessage cwnd mfc-networking

我有一个使用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类

    FOUND ANSWER #1 HERE

  2. // 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. 有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

找到了如何创建事件处理程序HERE的答案 您只需覆盖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最小化,也会发送和处理该消息。