gpt4 book ai didi

c# - 如何创建 C# 事件来处理来自 PostMessage() 的 MFC Windows 消息

转载 作者:行者123 更新时间:2023-11-30 17:59:30 25 4
gpt4 key购买 nike

我有一个使用 WINSOCK 的托管 C++ DLL。在接收时,它通过 PostMessage() 将自定义消息发送到 CWnd *。当从非托管 C++ 调用时,这工作正常。使用此代码构造后, objective-c Wnd * 已注册到 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 类

    FOUND ANSWER #1 HERE

// 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 Window 是否仍会收到这些消息?

  3. 有更好的方法吗?

最佳答案

找到如何创建事件处理程序的答案 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);
}

测试表明最后一个问题的答案是肯定的。即使表单最小化,也会发送和处理消息。

关于c# - 如何创建 C# 事件来处理来自 PostMessage() 的 MFC Windows 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11125843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com