65.9K
CodeProject 正在变化。 阅读更多。
Home

CHookWnd v1.02

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (4投票s)

2000 年 3 月 4 日

viewsIcon

80380

downloadIcon

1394

用于支持 MFC 子类化的免费 MFC 类

  • 下载源代码文件 - 19 Kb
  • 引言

    欢迎使用 CHookWnd,一个免费的 MFC 类,用于支持任何 CWnd 实例的子类化。它解决的问题是,您无法将两个 CWnd 实例同时附加到同一个 HWND。当您想让自己的某个类派生自两个都派生自 CWnd 的基类时,就会出现这个问题。例如,假设您有两个类,CBitmapMenuFrameWnd(派生自 CFrameWnd,实现了类似 Office 97 的位图菜单)和 CReBarFrameWnd(实现了类似 IE4 的命令栏菜单)。当您实现自己的 CMainFrame 类时,您会遇到问题,因为您只能派生自其中一个类,而必须将另一个类的源代码复制到您的类中。

    此类通过在 MFC 处理之前使用插件方法对窗口进行子类化来解决此问题。该代码部分基于 Paul DiLascia 为 MSJ 杂志开发的名为“CSubclassWnd”的类。

    特点
    用法
    历史
    API 参考
    计划增强功能
    联系作者


    特点

    • 简单干净的 C++ 接口。只需从 CHookWnd 派生您的插件类,并覆盖一个虚函数来实现您的功能。
    • 多线程安全类。
    • Unicode 支持,支持静态链接到 MFC,并且所有代码在警告级别 4 下都能干净地编译。


    用法

    • 要在您的代码中使用该类,请将 hookwnd.cpp 包含到您的项目中,并在任何需要调用该类的模块中 #include hookwnd.h
    • CHookWnd 派生您的类,并覆盖虚函数 WindowProc(),就像您编写第一个 Windows SDK 应用程序时所做的那样。
    • 通过调用您想要进行子类化的类的 Hook 函数来安装插件类。
    • 您的代码需要静态或动态地包含 MFC。
    • 您还需要将 afxmt.h 包含到您的预编译头文件中。如果未设置,代码将发出警告。
    • 要查看代码的实际效果,请查看示例应用程序,该应用程序安装了 3 个钩子,一个用于报告鼠标消息,另一个用于报告键盘消息,第三个则纯粹为了好玩。


    历史

    V1.0 (1999 年 2 月 25 日)
    • 首次公开发布。

    V1.01 (1999 年 3 月 29 日)

    • 小的更新,删除了代码中一些不必要的注释。

    V1.02 (1999 年 5 月 10 日)

    • 小的更新,修复了演示应用程序中的一个小 bug。实际 HookWnd 代码本身没有更改。


    API 参考

    API 由 CHookWnd 类的以下成员函数组成:

    CHookWnd::CHookWnd
    CHookWnd::~CHookWnd
    CHookWnd::Hook
    CHookWnd::UnHook
    CHookWnd::Default
    CHookWnd::WindowProc
    CHookWnd::IsHooked
    CHookWnd::FirstInChain
    CHookWnd::LastInChain
    CHookWnd::MiddleOfChain
    CHookWnd::SizeOfHookChain


    CHookWnd::CHookWnd

    BOOL CHookWnd::CHookWnd();

    备注
    标准的 C++ 构造函数。


    CHookWnd::~CHookWnd

    CHookWnd::~CHookWnd();

    备注
    标准的 C++ 析构函数。


    CHookWnd::Hook

    void CHookWnd::Hook(CWnd* pWnd);

    参数

    • pWnd -- 您想要进行子类化的 CWnd 实例。

    备注
    调用此成员函数以子类化由 MFC CWnd 实例“pWnd”当前子类化的 HWND。消息将在传递给链中的任何其他已安装的 CHookWnd 之前,路由到此实例的 WindowProc 方法,最终路由回标准的 MFC 消息映射。

    另请参阅
    CHookWnd::UnHook


    CHookWnd::UnHook

    void CHookWnd::UnHook();

    备注
    将此实例从处理子类化的钩子链中移除。

    另请参阅
    CHookWnd::Hook


    CHookWnd::Default

    LRESULT CHookWnd::Default();

    返回值
    窗口过程返回的标准 LRESULT。实际值取决于发送的消息。

    备注
    如果您想继续路由消息,可以在派生的 WindowProc 中调用此函数。这将把消息传递给链中的任何其他 CHookWnd,最终传递回 MFC 和您的消息映射。


    CHookWnd::WindowProc

    virtual LRESULT CHookWnd::WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam);

    返回值
    窗口过程返回的标准 LRESULT。实际值取决于发送的消息。

    参数

    • nMsg -- 指定要处理的 Windows 消息。
    • wParam -- 提供用于处理消息的附加信息。参数值取决于消息。
    • lParam -- 提供用于处理消息的附加信息。参数值取决于消息。

    备注
    这是您应该在派生类中覆盖的函数,用于实现您的插件功能。这看起来会非常类似于 SDK 窗口过程。对于您未处理的任何消息,您应该调用 Default。


    CHookWnd::IsHooked

    BOOL CHookWnd::IsHooked() const;

    返回值
    如果此实例当前正在钩取 CWnd,则为 TRUE,否则为 FALSE。

    备注
    此函数在 CHookWnd 内部用作断言,用于在您应该先调用 Hook 的函数中。


    CHookWnd::FirstInChain

    BOOL CHookWnd::FirstInChain() const;

    返回值
    如果此实例是处理子类化的 CHookWnd 链中的第一个,则为 TRUE,否则为 FALSE。


    CHookWnd::LastInChain

    BOOL CHookWnd::LastInChain() const;

    返回值
    如果此实例是处理子类化的 CHookWnd 链中的最后一个,则为 TRUE,否则为 FALSE。


    CHookWnd::MiddleOfChain

    BOOL CHookWnd::MiddleOfChain() const;

    返回值
    如果此实例位于链的中间,而不是第一个或最后一个,则为 TRUE。


    CHookWnd::SizeOfHookChain

    int CHookWnd::SizeOfHookChain() const;

    返回值
    当前处理子类化的链中 CHookWnd 的数量。



    计划增强功能

    • 实现支持在钩子链的末尾和中间安装钩子。
    • 提供一个更好的示例应用程序。目前,它非常像一个测试程序,测试所有函数。
    • 如果您有任何其他建议的改进,请告诉我,以便我将其纳入下一个版本。


    联系作者

    PJ Naughter
    电子邮件:pjn@indigo.ie
    网站:http://www.naughter.com
    1999 年 5 月 10 日

    © . All rights reserved.