73 lines
2 KiB
C++
73 lines
2 KiB
C++
// MsgHook.h: interface for the CMsgHook class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#if !defined(AFX_MSGHOOK_H__DED2E338_D3D5_11D1_82F1_0000F87A3912__INCLUDED_)
|
|
#define AFX_MSGHOOK_H__DED2E338_D3D5_11D1_82F1_0000F87A3912__INCLUDED_
|
|
|
|
#if _MSC_VER >= 1000
|
|
#pragma once
|
|
#endif // _MSC_VER >= 1000
|
|
|
|
class CMsgHook; // forward declaration
|
|
|
|
//////////////////
|
|
// The message hook map is derived from CMapPtrToPtr, which associates
|
|
// a pointer with another pointer. It maps an HWND to a CMsgHook, like
|
|
// the way MFC's internal maps map HWND's to CWnd's. The first hook
|
|
// attached to a window is stored in the map; all other hooks for that
|
|
// window are then chained via CMsgHook::m_pNext.
|
|
//
|
|
class CMsgHookMap : private CMapPtrToPtr
|
|
{
|
|
// Construction/Destruction
|
|
public:
|
|
CMsgHookMap();
|
|
~CMsgHookMap();
|
|
|
|
// Operations
|
|
public:
|
|
static CMsgHookMap& GetHookMap();
|
|
void Add(HWND hwnd, CMsgHook* pMsgHook);
|
|
void Remove(CMsgHook* pMsgHook);
|
|
void RemoveAll(HWND hwnd);
|
|
CMsgHook* Lookup(HWND hwnd);
|
|
};
|
|
|
|
class CMsgHook : public CObject
|
|
{
|
|
DECLARE_DYNAMIC(CMsgHook)
|
|
|
|
// Construction/Destruction
|
|
public:
|
|
CMsgHook();
|
|
virtual ~CMsgHook();
|
|
|
|
// Message Hook Operations
|
|
public:
|
|
// Hook a window. Hook(NULL) to unhook (automatic on WM_NCDESTROY)
|
|
BOOL HookWindow(CWnd* pRealWnd);
|
|
BOOL IsHooked() { return m_pWndHooked!=NULL; }
|
|
|
|
friend LRESULT CALLBACK HookWndProc(HWND, UINT, WPARAM, LPARAM);
|
|
friend class CMsgHookMap;
|
|
|
|
// Utility and Helper Functions
|
|
public:
|
|
HWND GetSafeHwnd() { return (m_pWndHooked?m_pWndHooked->GetSafeHwnd():NULL); }
|
|
|
|
// Implementation Operations
|
|
protected:
|
|
// Override this to handle messages in specific handlers
|
|
virtual LRESULT WindowProc(UINT msg, WPARAM wp, LPARAM lp);
|
|
LRESULT Default(); // call this at the end of handler fns
|
|
|
|
// Implementation Data Members
|
|
protected:
|
|
CWnd* m_pWndHooked; // the window hooked
|
|
WNDPROC m_pOldWndProc; // ..and original window proc
|
|
CMsgHook* m_pNext; // next in chain of hooks for this window
|
|
};
|
|
|
|
#endif // !defined(AFX_MSGHOOK_H__DED2E338_D3D5_11D1_82F1_0000F87A3912__INCLUDED_)
|