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# Forms 窗口最小化,它还会收到这些消息吗?

  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 回答