如何创建C#的事件处理和PostMessage MFC的Windows消息()(How to cre

2019-09-18 07:32发布

我有一个用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#形式类我如何获得一个CWnd *我的C ++类CUdpRetrySocket注册

    FOUND答案这里为#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#Forms窗口仍然收到这些消息?

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

Answer 1:

找到答案如何创建事件处理程序HERE
你只是覆盖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);
}

测试显示,回答最后一个问题是肯定的。 该消息被发送并且即使当窗体最小化处理。



文章来源: How to create C# Event to handle MFC Windows message from PostMessage()