我有一个使用 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 类。问题:
从 C# Forms 类我如何获得一个 CWnd * 来注册我的 C++ CUdpRetrySocket 类
// 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);
如何在我的 C# 窗口中创建事件以捕获此自定义 MFC 样式消息?
即使窗口最小化,我也需要 C# 应用程序来处理数据包。如果 C# Forms 窗口最小化,它还会收到这些消息吗?
有一个更好的方法吗?