【问题标题】:Hooking to MFC object creation globally全局挂钩到 MFC 对象创建
【发布时间】:2013-07-18 19:39:30
【问题描述】:

我有一个继承自 CWnd 的类 X,我想从应用程序域外部挂钩到 X Create,即程序 A 必须监视程序 B 中的 X 对象实例化。有什么方法可以做到这一点?

【问题讨论】:

  • 什么是X Create方法?演员 X:X?还是窗口相关的 OnCreate()?为什么不使用/重载这两个函数?或者你到底想达到什么目的?您是否知道当子类化到位时,您的 X 类将看不到控件的创建,而只会附加到已创建的控件?
  • 我所说的 X Create 方法是 X::Create 过程。我必须全局挂钩 X 类实例化。
  • 您的问题非常不具体,我看不出与您之前的问题stackoverflow.com/questions/17653061/… 有什么不同。
  • 这听起来很熟悉:有人将他们的问题分为两部分:简单的部分和不可能的部分。你在这里要求不可能的。不是绝对不可能,但也肯定不可行。我想这将有助于对您本质上想要实现的目标提供更高级别的描述。
  • 在我将此问题标记为由于不具体而关闭之前的最后一次尝试:我们只谈论 CWnd 吗?对象实例化是什么意思?之前您写道,您的意思是 CWnd::Create。这仍然是真的吗?还是您现在的意思是创建一个 X 对象,从而调用 X ctor X::X?

标签: c++ mfc


【解决方案1】:
  1. 您无法监控 X 对象的创建(X ctor X::X())。

  2. 您也无法监控对X::Create 的呼叫。

  3. 但可能有适合您的解决方案:

由于X::Create 调用CWnd::Create 并创建了一个窗口,因此您可以连接到窗口创建并且可能能够检测到何时创建了X 的窗口。但是,只有在创建的窗口有一些特殊之处(例如用于创建它们的已知窗口类)时,您才能认识到这一点。如果是这样的话,那么:

您在上一个问题Hooking window creation in an MFC program 中已经得到了正确答案。

您可以使用SetWindowsHookEx(WH_CBT, lpfn, hMod, dwThreadId) 在创建窗口时获得通知。

注意事项:

  • 钩子函数必须驻留在DLL中,而不是在调用SetWindowsHookEx的进程中。这是因为 windows 会将您的 DLL 加载/注入到它监视的每个进程中以创建窗口。
  • 如果要监控 32 位进程,则需要 32 位进程和 DLL。
  • 如果要监控 64 位进程,则需要 64 位进程和 DLL。
  • 如果要监控 32 位和 64 位进程,则需要 32 位和 64 位进程和 DLL。
  • 您的进程必须是 Windows 应用程序,而不是控制台应用程序,并且它必须不断发送消息。
  • 如果您知道线程 ID,则可以将其传递给 SetWindowsHookEx。如果没有,您可以传递 0,您将收到同一桌面上所有窗口的通知。
  • 谨慎使用钩子函数,不要忘记调用CallNextHookEx
  • 您将收到不同窗口上不同事件的通知,您必须过滤掉 nCode==HCBT_CREATEWND 和您感兴趣的窗口类(或其他)。

【讨论】:

  • 我想要从应用程序域外部连接到 Create 过程。在上一篇文章中,我没有提到“全局挂钩到 Create 过程”作为要求。
  • 从应用程序域之外是什么意思?你想让程序 A 监视程序 B 中的窗口创建吗?如果是这样,那么这是完全不同的事情。请调整您的问题以反映您真正想要的内容。
  • 是...程序 A 必须监视程序 B 中的窗口创建。我会更新我的问题。
  • @Katie 我根据您更新的问题更新了答案。
  • @Katie 那是什么?您要监视 窗口创建 还是 MFC 调用?你不断改变主意。如果你在游戏中途更改规则,提供帮助并不容易......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多