2013-07-15 59 views
0

我有一個類X從CWnd繼承和我想勾X來自外部的應用領域,即程序的有監視程序B. X對象實例創建有沒有辦法做到這個?鉤住MFC對象創建全球

+0

什麼是X創建方法? ctor X:X?或者窗口相關的OnCreate()?爲什麼不使用/重載這兩個函數?或者你想達到什麼目的?您是否知道當子類化到位時,您的類X將不會看到控件的創建,而只會附加到已創建的控件上? –

+0

我的意思是X創建方法是X :: Create procedure。我必須全局掛鉤到X類實例化。 – Katie

+0

你提的問題是非常不具體,我沒有看到你前面的問題http://stackoverflow.com/questions/17653061/hooking-window-creation-in-an-mfc-program的差異。 –

回答

1
  1. 不能監視X的對象(X構造函數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和窗口類(或其他),你是感興趣的
+0

我想從應用程序域之外的鉤子創建過程。在之前的文章中,我沒有提到'全局掛鉤創建過程'的要求。 – Katie

+0

你的意思是來自應用領域之外的什麼?你想讓程序A監控程序B中的窗口創建嗎?如果是這樣,那麼這是完全不同的事情。請調整您的問題以反映您真正想要的內容。 –

+0

Ya ...程序A必須監視程序B中的窗口創建。我將更新我的問題。 – Katie