You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
9.7 KiB
C++

// XTPSkinManagerApiHook.h: interface for the CXTPSkinManagerApiHook class.
//
// This file is a part of the XTREME SKINFRAMEWORK MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
//{{AFX_CODEJOCK_PRIVATE
#if !defined(__XTPSKINMANAGERAPIHOOK_H__)
#define __XTPSKINMANAGERAPIHOOK_H__
//}}AFX_CODEJOCK_PRIVATE
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CXTPWinThemeWrapper;
//{{AFX_CODEJOCK_PRIVATE
enum XTPSkinFrameworkApiFunctionIndex
{
xtpSkinApiLoadLibraryA,
xtpSkinApiLoadLibraryW,
xtpSkinApiLoadLibraryExA,
xtpSkinApiLoadLibraryExW,
xtpSkinApiGetProcAddress,
xtpSkinApiGetModuleHandleA,
xtpSkinApiRegisterClassA,
xtpSkinApiRegisterClassW,
xtpSkinApiGetSysColor,
xtpSkinApiGetSysColorBrush,
xtpSkinApiDrawEdge,
xtpSkinApiDrawFrameControl,
xtpSkinApiSetScrollInfo,
xtpSkinApiSetScrollPos,
xtpSkinApiGetScrollInfo,
xtpSkinApiEnableScrollBar,
xtpSkinApiOpenThemeData,
xtpSkinApiDrawThemeBackground,
xtpSkinApiCloseThemeData,
xtpSkinApiGetThemeColor,
xtpSkinApiGetThemeInt,
xtpSkinApiIsAppThemed,
xtpSkinApiIsThemeActive,
xtpSkinApiGetCurrentThemeName,
xtpSkinApiGetThemeSysBool,
xtpSkinApiGetThemeSysColor,
xtpSkinApiGetThemePartSize,
xtpSkinApiSystemParametersInfo,
xtpSkinApiDefWindowProcA,
xtpSkinApiDefWindowProcW,
xtpSkinApiDefMDIChildProcA,
xtpSkinApiDefMDIChildProcW,
xtpSkinApiDefFrameProcA,
xtpSkinApiDefFrameProcW,
xtpSkinApiDefDlgProcA,
xtpSkinApiDefDlgProcW,
xtpSkinApiCallWindowProcA,
xtpSkinApiCallWindowProcW,
xtpSkinApiCreateThread,
xtpSkinApiFillRect,
xtpSkinApiDeleteObject,
xtpSkinApiAdjustWindowRectEx,
xtpSkinApiAdjustWindowRect,
xtpSkinApiGetSystemMetrics,
xtpSkinApiTrackPopupMenu,
xtpSkinApiTrackPopupMenuEx,
xtpSkinApiDrawMenuBar,
xtpSkinApiLoadLibraryEx2W,
XTP_SKIN_APIHOOKCOUNT
};
class CXTPSkinManagerApiHook;
class CXTPSkinManagerApiFunction
{
public:
CXTPSkinManagerApiFunction(CXTPSkinManagerApiHook* pApiHook,
LPCSTR pszCalleeModName, LPCSTR pszFuncName, PROC pfnOrig, PROC pfnHook);
virtual ~CXTPSkinManagerApiFunction();
public:
BOOL HookImport();
BOOL UnhookImport();
private:
BOOL ReplaceInOneModule(LPCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller);
BOOL ReplaceInAllModules(LPCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew);
private:
CXTPSkinManagerApiHook* m_pApiHook;
BOOL m_bHooked;
char m_szCalleeModName[50];
char m_szFuncName[30];
PROC m_pfnOrig;
PROC m_pfnHook;
static PVOID sm_pvMaxAppAddr;
static PVOID sm_pfnAfxWndProc;
friend class CXTPSkinManagerApiHook;
friend class CXTPSkinObject;
};
class _XTP_EXT_CLASS CXTPSkinManagerApiHook
{
struct EXCLUDEDMODULE
{
HMODULE hModule;
CString strModule;
BOOL bWin9x;
};
private:
CXTPSkinManagerApiHook();
public:
static CXTPSkinManagerApiHook* AFX_CDECL GetInstance();
virtual ~CXTPSkinManagerApiHook();
public:
void ExcludeModule(LPCTSTR lpszModule, BOOL bWin9x);
BOOL IsModuleExcluded(HMODULE hModule) const;
public:
void InitializeHookManagement();
void FinalizeHookManagement();
public:
CXTPSkinManagerApiFunction* GetHookedFunction(LPCSTR pszCalleeModName, LPCSTR pszFuncName);
CXTPSkinManagerApiFunction* GetHookedFunction(XTPSkinFrameworkApiFunctionIndex nIndex);
static PROC AFX_CDECL GetOriginalProc(XTPSkinFrameworkApiFunctionIndex nIndex);
public:
static FARPROC WINAPI GetProcAddressWindows(HMODULE hmod, LPCSTR pszProcName);
static BOOL WINAPI AdjustWindowRectExOrig(LPRECT lpRect, DWORD dwStyle, BOOL bMenu, DWORD dwExStyle);
static LRESULT WINAPI CallWindowProcOrig(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
static BOOL AFX_CDECL IsSystemWindowModule(WNDPROC lpWndProc);
void ConnectWrapper(CXTPWinThemeWrapper* pThemeWrapper);
protected:
void UnhookAllFunctions();
CXTPSkinManagerApiFunction* HookImport(XTPSkinFrameworkApiFunctionIndex nIndex, LPCSTR pszCalleeModName, LPCSTR pszFuncName, PROC pfnHook);
private:
static HMODULE WINAPI OnHookGetModuleHandleA(LPCSTR lpModuleName);
CXTPSkinManagerApiFunction* AddHook(XTPSkinFrameworkApiFunctionIndex nIndex, LPCSTR pszCalleeModName, LPCSTR pszFuncName, PROC pfnOrig, PROC pfnHook);
BOOL RemoveHook(LPCSTR pszCalleeModName, LPCSTR pszFuncName);
void HackModuleOnLoad(HMODULE hmod, DWORD dwFlags);
static HMODULE WINAPI OnHookLoadLibraryW(PCWSTR pszModuleName);
static HMODULE WINAPI OnHookLoadLibraryExA(LPCSTR pszModuleName, HANDLE hFile, DWORD dwFlags);
static HMODULE WINAPI OnHookLoadLibraryExW(PCWSTR pszModuleName, HANDLE hFile, DWORD dwFlags);
static HMODULE WINAPI OnHookLoadLibraryEx2W(PCWSTR pszModuleName, HANDLE hFile, DWORD dwFlags);
static FARPROC WINAPI OnHookGetProcAddress(HMODULE hmod, PCSTR pszProcName);
static HMODULE WINAPI OnHookLoadLibraryA(LPCSTR pszModuleName);
static ATOM WINAPI OnHookRegisterClassA( const WNDCLASSA *lpWndClass);
static ATOM WINAPI OnHookRegisterClassW( const WNDCLASSW *lpWndClass);
static int WINAPI OnHookSetScrollInfo(HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, BOOL fRedraw);
static int WINAPI OnHookSetScrollPos(HWND hwnd, int nBar, int nPos, BOOL redraw);
static BOOL WINAPI OnHookAdjustWindowRectEx(LPRECT lpRect, DWORD dwStyle, BOOL bMenu, DWORD dwExStyle);
static BOOL WINAPI OnHookAdjustWindowRect(LPRECT lpRect, DWORD dwStyle, BOOL bMenu);
static int WINAPI OnHookGetSystemMetrics(int nIndex);
static BOOL WINAPI OnHookEnableScrollBar(HWND hWnd, UINT wSBflags, UINT wArrows);
static BOOL WINAPI OnHookGetScrollInfo(HWND hwnd, int nBar, LPSCROLLINFO lpsi);
static DWORD WINAPI OnHookGetSysColor(int nIndex);
static BOOL WINAPI OnHookDeleteObject(HGDIOBJ hObject);
static BOOL WINAPI OnHookDrawEdge (HDC hdc, LPRECT qrc, UINT edge, UINT grfFlags);
static BOOL WINAPI OnHookDrawFrameControl(HDC hDC, LPRECT rect, UINT, UINT);
static HBRUSH WINAPI OnHookGetSysColorBrush(int nIndex);
static BOOL WINAPI OnHookSystemParametersInfo (UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni);
static LRESULT WINAPI OnHookDefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
static LRESULT WINAPI OnHookDefWindowProcW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
static LRESULT WINAPI OnHookDefFrameProcA(HWND hWnd, HWND hWndMDIClient, UINT Msg, WPARAM wParam, LPARAM lParam);
static LRESULT WINAPI OnHookDefFrameProcW(HWND hWnd, HWND hWndMDIClient, UINT Msg, WPARAM wParam, LPARAM lParam);
static LRESULT WINAPI OnHookDefDlgProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
static LRESULT WINAPI OnHookDefDlgProcW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
static LRESULT WINAPI OnHookDefMDIChildProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
static LRESULT WINAPI OnHookDefMDIChildProcW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
static LRESULT WINAPI OnHookCallWindowProcA(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
static LRESULT WINAPI OnHookCallWindowProcW(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
static int WINAPI OnHookFillRect( HDC hDC, CONST RECT *lprc, HBRUSH hbr);
static BOOL WINAPI OnHookTrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, int nReserved, HWND hWnd, CONST RECT *prcRect);
static BOOL WINAPI OnHookTrackPopupMenuEx(HMENU hMenu, UINT uFlags, int x, int y, HWND hWnd, LPTPMPARAMS);
static BOOL WINAPI OnHookDrawMenuBar(HWND hWnd);
static HRESULT STDAPICALLTYPE OnHookGetCurrentThemeName(LPWSTR pszThemeFileName, int dwMaxNameChars, LPWSTR pszColorBuff, int cchMaxColorChars, LPWSTR /*pszSizeBuff*/, int /*cchMaxSizeChars*/);
static BOOL STDAPICALLTYPE OnHookGetThemeSysBool(HTHEME /*hTheme*/, int iBoolId);
static COLORREF STDAPICALLTYPE OnHookGetThemeSysColor(HTHEME /*hTheme*/, int iColorId);
static HRESULT STDAPICALLTYPE OnHookGetThemePartSize(HTHEME hTheme, HDC, int iPartId, int iStateId, RECT *pRect, THEMESIZE eSize, SIZE* pSize);
static BOOL STDAPICALLTYPE OnHookIsAppThemed();
static BOOL STDAPICALLTYPE OnHookIsThemeActive();
static HRESULT STDAPICALLTYPE OnHookGetThemeColor(HTHEME hTheme, int iPartId, int iStateId, int iPropID, COLORREF *pColor);
static HRESULT STDAPICALLTYPE OnHookGetThemeInt(HTHEME hTheme, int iPartId, int iStateId, int iPropID, int *piVal);
static HRESULT STDAPICALLTYPE OnHookCloseThemeData(HTHEME);
static HRESULT STDAPICALLTYPE OnHookDrawThemeBackground(HTHEME hTheme, HDC hDC, int iPartId, int iStateId, const RECT* pRect, const RECT*);
static HTHEME STDAPICALLTYPE OnHookOpenThemeData(HWND /*hWnd*/, LPCWSTR pszClassList);
static HANDLE STDAPICALLTYPE OnHookCreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
UINT_PTR dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,
DWORD dwCreationFlags, LPDWORD lpThreadId);
static DWORD WINAPI ThreadProcHook(LPVOID lpParameter);
BOOL CallHookDefWindowProc(HWND hWnd, PROC pfnOrig, XTPSkinDefaultProc defProc, LPVOID lpPrev, UINT nMessage, WPARAM& wParam, LPARAM& lParam, LRESULT& lResult);
protected:
CXTPSkinManagerApiFunction* m_arrFunctions[XTP_SKIN_APIHOOKCOUNT];
BOOL m_bInitialized;
CArray<EXCLUDEDMODULE, EXCLUDEDMODULE&> m_arrExcludedModules;
CRITICAL_SECTION m_cs;
friend class CXTPSkinManagerApiFunction;
};
//}}AFX_CODEJOCK_PRIVATE
#endif // !defined(__XTPSKINMANAGERAPIHOOK_H__)