#pragma once class GlwSubclassWnd; class GlwSubclassWndMap : private CMapPtrToPtr { public: GlwSubclassWndMap(){} ~GlwSubclassWndMap(){} static GlwSubclassWndMap& GetHookMap(); void Add(HWND hwnd, GlwSubclassWnd* pSubclassWnd); void Remove(GlwSubclassWnd* pSubclassWnd); void RemoveAll(HWND hwnd); GlwSubclassWnd* Lookup(HWND hwnd); }; class GlwSubclassWnd : public CObject { public: DECLARE_DYNAMIC(GlwSubclassWnd); GlwSubclassWnd(); ~GlwSubclassWnd(); // widget a window. Hook(NULL) to unhook (automatic on WM_NCDESTROY) virtual BOOL HookWindow(HWND hwnd); virtual BOOL HookWindow(CWnd* pWnd) { return HookWindow(pWnd->GetSafeHwnd()); } virtual BOOL IsHooked() { return m_hWnd!=NULL; } friend LRESULT CALLBACK HookWndProc(HWND, UINT, WPARAM, LPARAM); friend class GlwSubclassWndMap; protected: HWND m_hWnd; // the window hooked WNDPROC m_pOldWndProc; // and original window proc GlwSubclassWnd* m_pNext; // next in chain of hooks for this window virtual LRESULT WindowProc(UINT msg, WPARAM wp, LPARAM lp); virtual LRESULT Default(); // call this at the end of handler fns };