我有一个使用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类。 问题:
从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#app来处理数据包。如果最小化,C#Forms窗口是否仍会收到这些消息?
有更好的方法吗?
答案 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最小化,也会发送和处理该消息。