如何创建C#事件来处理来自PostMessage()的MFC Windows消息
我有一个使用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类
在这里找到#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);
-
如何在C#窗口中创建一个事件来捕获此自定义MFC样式消息?
-
即使窗口最小化,我也需要C#app来处理数据包。 如果最小化,C#Forms窗口是否仍然会收到这些消息?
-
有一个更好的方法吗?
找到了如何在这里创建事件处理程序的答案
您只需覆盖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最小化,也会发送和处理消息。
上述就是C#学习教程:如何创建C#事件来处理来自PostMessage()的MFC Windows消息分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/942850.html