挂钩到全局MFC对象创建

时间:2013-07-15 13:48:41

标签: c++ mfc

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

1 个答案:

答案 0 :(得分:1)

  1. 您无法监控X对象的创建(X ctor X::X())。

  2. 您也无法监控对X::Create的通话。

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

  4. 由于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以及您感兴趣的窗口类(或其他)。