CHookWnd v1.02






4.47/5 (4投票s)
2000 年 3 月 4 日

80380

1394
用于支持 MFC 子类化的免费 MFC 类
引言
欢迎使用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 日