在 MFC 中,CWinThread 类确实有一个名为 ProcessMessageFilter 的公共方法,用于在消息循环中处理消息过滤器。ProcessMessageFilter 方法允许线程级别的消息过滤器拦截和处理消息。

以下是一个简单的示例,演示如何在 CWinThread 派生类中使用 ProcessMessageFilter:
// 假设你的应用程序类为 CMyApp,线程类为 CMyThread
#include "CMyApp.h"
#include "CMyThread.h"

BOOL CMyApp::InitInstance()
{
    // 创建并运行新线程
    CMyThread* pThread = (CMyThread*)AfxBeginThread(RUNTIME_CLASS(CMyThread));

    // 其他初始化工作...

    return TRUE;
}

BOOL CMyThread::PreTranslateMessage(MSG* pMsg)
{
    // 在消息循环中预处理消息

    // 示例:处理键盘消息
    if (pMsg->message == WM_KEYDOWN)
    {
        // 处理键盘消息
        TRACE(_T("Key pressed: %d\n"), pMsg->wParam);
        return TRUE;  // 返回 TRUE 表示消息已经被处理
    }

    // 返回 FALSE 表示消息将被正常处理
    return CWinThread::PreTranslateMessage(pMsg);
}

BOOL CMyThread::ProcessMessageFilter(int code, LPMSG lpMsg)
{
    // 在消息循环中处理消息过滤器

    // 示例:处理鼠标消息
    if (code < 0 && lpMsg->message == WM_MOUSEMOVE)
    {
        // 处理鼠标消息
        TRACE(_T("Mouse moved!\n"));
        return TRUE;  // 返回 TRUE 表示消息已经被处理
    }

    // 返回 FALSE 表示消息将被正常处理
    return CWinThread::ProcessMessageFilter(code, lpMsg);
}

在上述代码中,ProcessMessageFilter 方法被重载以处理消息过滤器。在 CMyThread 类中,还重载了 PreTranslateMessage 方法以处理键盘消息的预处理。

请注意,ProcessMessageFilter 方法是在消息循环中被调用的,可以在这里执行一些在消息到达窗口前的操作。这对于实现线程级别的消息过滤器非常有用。


转载请注明出处:http://www.pingtaimeng.com/article/detail/23230/MFC/CWinThread