152 lines
6.8 KiB
C
152 lines
6.8 KiB
C
|
#ifndef __HANDLERS_H__
|
||
|
#define __HANDLERS_H__
|
||
|
|
||
|
//---------------------------------------------------------------------------//
|
||
|
#define _MSG_SWITCH_ // determines handler selection implementation
|
||
|
// (switch block vs. linear array search (vs. hash table lookup?) )
|
||
|
|
||
|
//-------------------//
|
||
|
// Forwards
|
||
|
class CThemeWnd;
|
||
|
struct _NCTHEMEMET;
|
||
|
typedef struct _NCTHEMEMET NCTHEMEMET;
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// Hook modification
|
||
|
BOOL ApiHandlerInit( const LPCTSTR pszTarget, USERAPIHOOK* puahTheme, const USERAPIHOOK* puahReal );
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// Window message handler support
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
typedef enum _MSGTYPE
|
||
|
{
|
||
|
MSGTYPE_PRE_WNDPROC, // pre-wndproc override
|
||
|
MSGTYPE_POST_WNDPROC, // post-wndproc override
|
||
|
MSGTYPE_PRE_DEFDLGPROC, // pre-DefDlgProc override
|
||
|
MSGTYPE_POST_DEFDLGPROC,// post-DefDlgProc override
|
||
|
MSGTYPE_DEFWNDPROC, // DefWindowProc hook.
|
||
|
}MSGTYPE;
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
typedef struct _THEME_MSG
|
||
|
{
|
||
|
HWND hwnd; // message target.
|
||
|
UINT uMsg; // message id.
|
||
|
WPARAM wParam; // message WPARAM
|
||
|
LPARAM lParam; // message LPARAM
|
||
|
MSGTYPE type; // type of message (dwp, sent, posted)
|
||
|
UINT uCodePage; // message codepage. This will invariably be CP_WINUNICODE for
|
||
|
// a message processed via the wide-char defwindowproc, or
|
||
|
// the current user default codepage for messages passed through
|
||
|
// the ansi defwindowproc.
|
||
|
WNDPROC pfnDefProc; // address of function handler should call to do default processing
|
||
|
LRESULT lRet; // Post overrides only: msg result from default handler.
|
||
|
BOOL fHandled; // handler should set this value.
|
||
|
|
||
|
}THEME_MSG, *PTHEME_MSG;
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// Message handler prototype
|
||
|
typedef LRESULT (CALLBACK * HOOKEDMSGHANDLER)(CThemeWnd* pwnd, THEME_MSG *ptm );
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// Message handler array element
|
||
|
typedef struct _MSGENTRY
|
||
|
{
|
||
|
UINT nMsg; // message identifier (zero if registered message)
|
||
|
UINT *pnRegMsg; // address of registered message var (NULL if stock message)
|
||
|
HOOKEDMSGHANDLER pfnHandler; // primary handler
|
||
|
HOOKEDMSGHANDLER pfnHandler2; // secondary handler (optional for DWP, WH handlers)
|
||
|
} MSGENTRY, *PMSGENTRY;
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// Performs default processing on the message
|
||
|
LRESULT WINAPI DoMsgDefault( const THEME_MSG* ptm );
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
inline void WINAPI MsgHandled( const THEME_MSG *ptm, BOOL fHandled = TRUE ) {
|
||
|
((PTHEME_MSG)ptm)->fHandled = fHandled;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// message mask helpers
|
||
|
#define MAKE_MSGBIT( nMsg ) ((BYTE)(1 << (nMsg & 7)))
|
||
|
#define SET_MSGMASK( prgMsgMask, nMsg ) (prgMsgMask[nMsg/8] |= MAKE_MSGBIT(nMsg))
|
||
|
#define CLEAR_MSGMASK( prgMsgMask, nMsg ) (prgMsgMask[nMsg/8] &= ~MAKE_MSGBIT(nMsg))
|
||
|
#define CHECK_MSGMASK( prgMsgMask, nMsg ) ((prgMsgMask[nMsg/8] & MAKE_MSGBIT(nMsg)) != 0)
|
||
|
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Message handler table access
|
||
|
extern void HandlerTableInit();
|
||
|
|
||
|
DWORD GetOwpMsgMask( LPBYTE* prgMsgList );
|
||
|
DWORD GetDdpMsgMask( LPBYTE* prgMsgList );
|
||
|
DWORD GetDwpMsgMask( LPBYTE* prgMsgList );
|
||
|
|
||
|
BOOL FindOwpHandler( UINT uMsg,
|
||
|
OUT OPTIONAL HOOKEDMSGHANDLER* ppfnPre,
|
||
|
OUT OPTIONAL HOOKEDMSGHANDLER* ppfnPost );
|
||
|
BOOL FindDdpHandler( UINT uMsg,
|
||
|
OUT OPTIONAL HOOKEDMSGHANDLER* ppfnPre,
|
||
|
OUT OPTIONAL HOOKEDMSGHANDLER* ppfnPost );
|
||
|
BOOL FindDwpHandler( UINT uMsg,
|
||
|
OUT OPTIONAL HOOKEDMSGHANDLER* ppfn );
|
||
|
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// table decl helpers
|
||
|
#define DECL_MSGHANDLER(handler) LRESULT CALLBACK handler(CThemeWnd*, THEME_MSG *)
|
||
|
#define DECL_REGISTERED_MSG(msg) extern UINT msg;
|
||
|
|
||
|
#define BEGIN_HANDLER_TABLE(rgEntries) static MSGENTRY rgEntries[] = {
|
||
|
#define END_HANDLER_TABLE() };
|
||
|
|
||
|
#define DECL_MSGENTRY(msg,pfnPre,pfnPost) {msg, NULL, pfnPre, pfnPost},
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// SystemParametersInfo handler support
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// SystemParametersInfo handler prototype
|
||
|
typedef BOOL (CALLBACK * SPIHANDLER)(
|
||
|
NCTHEMEMET *pnctm,
|
||
|
IN UINT uiAction, IN UINT uiParam, IN OUT PVOID pvParam, IN UINT fWinIni,
|
||
|
SYSTEMPARAMETERSINFO pfnDefault, BOOL& fHandled );
|
||
|
|
||
|
BOOL FindSpiHandler( IN UINT uiAction, OUT SPIHANDLER* pfnHandler );
|
||
|
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// table decl helpers
|
||
|
#define DECL_SPIHANDLER(handler) BOOL CALLBACK handler(NCTHEMEMET*, UINT, UINT, PVOID, UINT, SYSTEMPARAMETERSINFO, BOOL& )
|
||
|
#define BEGIN_SPIHANDLER_TABLE() BOOL FindSpiHandler( UINT uiAction, SPIHANDLER* pfnHandler ) {\
|
||
|
switch(uiAction){
|
||
|
#define DECL_SPIENTRY(uiAction, handler) case uiAction: {*pfnHandler = handler; return TRUE;}
|
||
|
#define END_SPIHANDLER_TABLE() }return FALSE;}
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// GetSystemMetrics handler support
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// GetSystemMetrics handler prototype
|
||
|
typedef int (CALLBACK * GSMHANDLER)(
|
||
|
NCTHEMEMET *pnctm, IN int iMetric,
|
||
|
GETSYSTEMMETRICSPROC pfnDefault, BOOL& fHandled );
|
||
|
|
||
|
typedef struct _GSMENTRY {
|
||
|
int iMetric;
|
||
|
GSMHANDLER pfnHandler;
|
||
|
} GSMENTRY;
|
||
|
|
||
|
BOOL FindGsmHandler( IN int iMetric, OUT GSMHANDLER* pfnHandler );
|
||
|
|
||
|
#define DECL_GSMHANDLER(handler) int CALLBACK handler(NCTHEMEMET*, int, GETSYSTEMMETRICSPROC, BOOL& )
|
||
|
#define BEGIN_GSMHANDLER_TABLE(rgEntries) static GSMENTRY rgEntries[] = {
|
||
|
#define END_GSMHANDLER_TABLE() };
|
||
|
#define DECL_GSMENTRY(iMetric, handler) {iMetric, handler},
|
||
|
|
||
|
#endif __HANDLERS_H__
|