MFC DLL如何响应PreTranslateMessage消息

第一步:在App类中定义钩子

class CTestApp : public CWinApp
{
public:
    CTestApp();
    HHOOK m_hHook;

第二步:构造函数中初始化成员变量

CTestApp::CTestApp():m_hHook(NULL),m_dlg(NULL)
{
    // TODO: 在此处添加构造代码,
    // 将所有重要的初始化放置在 InitInstance 中
}

第三步:定义钩子函数

class CTestApp : public CWinApp
{
public:
    CTestApp();
    HHOOK m_hHook;
// 重写
public:
    virtual BOOL InitInstance();

    DECLARE_MESSAGE_MAP()
    virtual int ExitInstance();
    static LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam);
};
LRESULT CALLBACK CTestApp::GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
    LPMSG lpMsg = (LPMSG)lParam;
    //这里可以查看消息 lpMsg->message

    //也可以过滤后调入PreTranslateMessage
    AfxGetApp()->PreTranslateMessage(lpMsg);
    return CallNextHookEx(theApp.m_hHook, nCode, wParam, lParam);
}

第四步:安装钩子

BOOL CTestApp::InitInstance()
{
    BOOL bInit = CWinApp::InitInstance();

    if (bInit)
    {
        // TODO: Add your own module initialization code here.
        m_hHook = ::SetWindowsHookEx(
            WH_GETMESSAGE,
            GetMessageProc,
            AfxGetInstanceHandle(),
            GetCurrentThreadId());

        return CWinApp::InitInstance();    
    }

    return bInit;
}

 第五步:卸载钩子

int CTestApp::ExitInstance()
{
    // TODO: 在此添加专用代码和/或调用基类
    UnhookWindowsHookEx((HHOOK)m_hHook);
    return CWinApp::ExitInstance();
}

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

菜码农

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值