XTPSkinManagerApiHook.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:45k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPSkinManagerApiHook.cpp: implementation of the CXTPSkinManagerApiHook class.
  2. //
  3. // This file is a part of the XTREME SKINFRAMEWORK MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include <imagehlp.h>
  22. #pragma comment(lib, "imagehlp.lib")
  23. #include "Common/XTPVC80Helpers.h"
  24. #include "XTPSkinManager.h"
  25. #include "XTPSkinObjectFrame.h"
  26. #include "XTPSkinDrawTools.h"
  27. #include "XTPSkinManagerApiHook.h"
  28. #include "XTPSkinManagerModuleList.h"
  29. #include "XTPSkinManagerResource.h"
  30. #ifdef _UNICODE
  31. #define lpszSystemParametersInfo "SystemParametersInfoW"
  32. #else
  33. #define lpszSystemParametersInfo "SystemParametersInfoA"
  34. #endif
  35. int XTPCompareStringNoCase(const char* dst, const char* src)
  36. {
  37. int f, l;
  38. do
  39. {
  40. f = (unsigned char)(*(dst++));
  41. if ((f >= 'A') && (f <= 'Z'))
  42. f -= ('A' - 'a');
  43. l = (unsigned char)(*(src++));
  44. if ((l >= 'A') && (l <= 'Z'))
  45. l -= ('A' - 'a');
  46. }
  47. while ( f && (f == l) );
  48. return (f - l);
  49. }
  50. CXTPSkinManagerApiHook::CXTPSkinManagerApiHook()
  51. {
  52. m_bInitialized = FALSE;
  53. ZeroMemory(&m_arrFunctions, sizeof(m_arrFunctions));
  54. ExcludeModule(_T("SHLWAPI.DLL"), TRUE);
  55. ExcludeModule(_T("COMCTL32.DLL"), TRUE);
  56. ExcludeModule(_T("KERNEL32.DLL"), FALSE);
  57. ExcludeModule(_T("USER32.DLL"), FALSE);
  58. ExcludeModule(_T("GDI32.DLL"), FALSE);
  59. ExcludeModule(_T("WININET.DLL"), FALSE);
  60. ::InitializeCriticalSection(&m_cs);
  61. }
  62. CXTPSkinManagerApiHook::~CXTPSkinManagerApiHook()
  63. {
  64. FinalizeHookManagement();
  65. ::DeleteCriticalSection(&m_cs);
  66. }
  67. void CXTPSkinManagerApiHook::ConnectWrapper(CXTPWinThemeWrapper* pThemeWrapper)
  68. {
  69. pThemeWrapper->CreateSharedData();
  70. pThemeWrapper->SetThemeWrapperPtr(xtpWrapperOpenThemeData, &CXTPSkinManagerApiHook::OnHookOpenThemeData);
  71. pThemeWrapper->SetThemeWrapperPtr(xtpWrapperDrawThemeBackground, &CXTPSkinManagerApiHook::OnHookDrawThemeBackground);
  72. pThemeWrapper->SetThemeWrapperPtr(xtpWrapperCloseThemeData, &CXTPSkinManagerApiHook::OnHookCloseThemeData);
  73. pThemeWrapper->SetThemeWrapperPtr(xtpWrapperGetThemeColor, &CXTPSkinManagerApiHook::OnHookGetThemeColor);
  74. pThemeWrapper->SetThemeWrapperPtr(xtpWrapperIsAppThemed, &CXTPSkinManagerApiHook::OnHookIsAppThemed);
  75. pThemeWrapper->SetThemeWrapperPtr(xtpWrapperIsThemeActive, &CXTPSkinManagerApiHook::OnHookIsThemeActive);
  76. pThemeWrapper->SetThemeWrapperPtr(xtpWrapperGetCurrentThemeName, &CXTPSkinManagerApiHook::OnHookGetCurrentThemeName);
  77. pThemeWrapper->SetThemeWrapperPtr(xtpWrapperGetThemeSysBool, &CXTPSkinManagerApiHook::OnHookGetThemeSysBool);
  78. pThemeWrapper->SetThemeWrapperPtr(xtpWrapperGetThemeSysColor, &CXTPSkinManagerApiHook::OnHookGetThemeSysColor);
  79. pThemeWrapper->SetThemeWrapperPtr(xtpWrapperGetThemePartSize, &CXTPSkinManagerApiHook::OnHookGetThemePartSize);
  80. }
  81. CXTPSkinManagerApiHook* CXTPSkinManagerApiHook::GetInstance()
  82. {
  83. static CXTPSkinManagerApiHook instance;
  84. return &instance;
  85. }
  86. void CXTPSkinManagerApiHook::ExcludeModule(LPCTSTR lpszModule, BOOL bWin9x)
  87. {
  88. EXCLUDEDMODULE em;
  89. em.bWin9x = bWin9x;
  90. em.strModule = lpszModule;
  91. em.hModule = 0;
  92. m_arrExcludedModules.Add(em);
  93. }
  94. BOOL CXTPSkinManagerApiHook::IsModuleExcluded(HMODULE hModule) const
  95. {
  96. BOOL bWin9x = XTPSkinManager()->IsWin9x();
  97. for (int i = 0; i < (int)m_arrExcludedModules.GetSize(); i++)
  98. {
  99. const EXCLUDEDMODULE& em = m_arrExcludedModules[i];
  100. if (em.bWin9x && !bWin9x)
  101. continue;
  102. if (em.hModule == hModule)
  103. return TRUE;
  104. }
  105. return FALSE;
  106. }
  107. void CXTPSkinManagerApiHook::UnhookAllFunctions()
  108. {
  109. for (int i = 0; i < XTP_SKIN_APIHOOKCOUNT; i++)
  110. {
  111. CXTPSkinManagerApiFunction* pHook = m_arrFunctions[i];
  112. if (pHook)
  113. {
  114. pHook->UnhookImport();
  115. delete pHook;
  116. m_arrFunctions[i] = NULL;
  117. }
  118. }
  119. ZeroMemory(&m_arrFunctions, sizeof(m_arrFunctions));
  120. }
  121. CXTPSkinManagerApiFunction* CXTPSkinManagerApiHook::HookImport(XTPSkinFrameworkApiFunctionIndex nIndex, LPCSTR pszCalleeModName, LPCSTR pszFuncName, PROC  pfnHook)
  122. {
  123. CXTPSkinManagerApiFunction* pResult = NULL;
  124. try
  125. {
  126. if (!GetHookedFunction(pszCalleeModName, pszFuncName))
  127. {
  128. if (XTPCompareStringNoCase(pszCalleeModName, "UXTHEME.DLL") == 0)
  129. {
  130. return AddHook(nIndex, pszCalleeModName, pszFuncName, NULL, pfnHook);
  131. }
  132. PROC pfnOrig = GetProcAddressWindows(::GetModuleHandleA(pszCalleeModName), pszFuncName);
  133. if (NULL == pfnOrig)
  134. {
  135. HMODULE hmod = ::LoadLibraryA(pszCalleeModName);
  136. if (hmod)
  137. {
  138. pfnOrig = GetProcAddressWindows(::GetModuleHandleA(pszCalleeModName), pszFuncName);
  139. }
  140. }
  141. if (pfnOrig)
  142. {
  143. pResult = AddHook(nIndex, pszCalleeModName, pszFuncName, pfnOrig,pfnHook);
  144. }
  145. }
  146. }
  147. catch(...)
  148. {
  149. }
  150. return pResult;
  151. }
  152. CXTPSkinManagerApiFunction* CXTPSkinManagerApiHook::AddHook(XTPSkinFrameworkApiFunctionIndex nIndex, LPCSTR pszCalleeModName, LPCSTR pszFuncName, PROC  pfnOrig, PROC  pfnHook)
  153. {
  154. ASSERT(!GetHookedFunction(pszCalleeModName, pszFuncName));
  155. ASSERT(!GetHookedFunction(nIndex));
  156. ASSERT(nIndex < XTP_SKIN_APIHOOKCOUNT);
  157. if (nIndex >= XTP_SKIN_APIHOOKCOUNT)
  158. return NULL;
  159. CXTPSkinManagerApiFunction* pHook = new CXTPSkinManagerApiFunction(this, pszCalleeModName, pszFuncName, pfnOrig, pfnHook);
  160. m_arrFunctions[nIndex] = pHook;
  161. pHook->HookImport();
  162. return pHook;
  163. }
  164. FARPROC WINAPI CXTPSkinManagerApiHook::GetProcAddressWindows(HMODULE hModule, LPCSTR pszProcName)
  165. {
  166. typedef FARPROC (WINAPI* LPFNGETPROCADDRESS)(HMODULE hModule, LPCSTR pszProcName);
  167. PROC pfnOrig = GetOriginalProc(xtpSkinApiGetProcAddress);
  168. if (pfnOrig)
  169. return ((LPFNGETPROCADDRESS)pfnOrig)(hModule, pszProcName);
  170. return ::GetProcAddress(hModule, pszProcName);
  171. }
  172. LRESULT WINAPI CXTPSkinManagerApiHook::CallWindowProcOrig(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  173. {
  174. typedef LRESULT (WINAPI* LPFNCALLWINDOWPROC)(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  175. #ifdef _UNICODE
  176. PROC pfnOrig = GetOriginalProc(xtpSkinApiCallWindowProcW);
  177. #else
  178. PROC pfnOrig = GetOriginalProc(xtpSkinApiCallWindowProcA);
  179. #endif
  180. if (pfnOrig)
  181. return ((LPFNCALLWINDOWPROC)pfnOrig)(lpPrevWndFunc, hWnd, Msg, wParam, lParam);
  182. return ::CallWindowProc(lpPrevWndFunc, hWnd, Msg, wParam, lParam);
  183. }
  184. CXTPSkinManagerApiFunction* CXTPSkinManagerApiHook::GetHookedFunction(XTPSkinFrameworkApiFunctionIndex nIndex)
  185. {
  186. ASSERT(nIndex < XTP_SKIN_APIHOOKCOUNT);
  187. if (nIndex < 0 || nIndex >= XTP_SKIN_APIHOOKCOUNT)
  188. return NULL;
  189. return m_arrFunctions[nIndex];
  190. }
  191. PROC AFX_CDECL CXTPSkinManagerApiHook::GetOriginalProc(XTPSkinFrameworkApiFunctionIndex nIndex)
  192. {
  193. CXTPSkinManagerApiFunction* pFunction = GetInstance()->GetHookedFunction(nIndex);
  194. if (!pFunction)
  195. return NULL;
  196. return pFunction->m_pfnOrig;
  197. }
  198. CXTPSkinManagerApiFunction* CXTPSkinManagerApiHook::GetHookedFunction(LPCSTR pszCalleeModName, LPCSTR pszFuncName)
  199. {
  200. for (int i = 0; i < XTP_SKIN_APIHOOKCOUNT; i++)
  201. {
  202. CXTPSkinManagerApiFunction* pHook = m_arrFunctions[i];
  203. if (!pHook)
  204. {
  205. continue;
  206. }
  207. if (XTPCompareStringNoCase(pHook->m_szCalleeModName, pszCalleeModName) == 0 &&
  208. XTPCompareStringNoCase(pHook->m_szFuncName, pszFuncName) == 0)
  209. {
  210. return pHook;
  211. }
  212. }
  213. return NULL;
  214. }
  215. //
  216. // The PUSH opcode on x86 platforms
  217. //
  218. const BYTE cPushOpCode = 0x68;
  219. PVOID CXTPSkinManagerApiFunction::sm_pvMaxAppAddr = NULL;
  220. PVOID CXTPSkinManagerApiFunction::sm_pfnAfxWndProc = NULL;
  221. //////////////////////////////////////////////////////////////////////////
  222. // CXTPSkinManagerApiFunction
  223. CXTPSkinManagerApiFunction::CXTPSkinManagerApiFunction( CXTPSkinManagerApiHook* pApiHook,
  224. LPCSTR pszCalleeModName, LPCSTR pszFuncName, PROC pfnOrig, PROC pfnHook)
  225. :
  226. m_pApiHook(pApiHook),
  227. m_bHooked(FALSE),
  228. m_pfnOrig(pfnOrig),
  229. m_pfnHook(pfnHook)
  230. {
  231. #if (_MSC_VER > 1310) // VS2005
  232. strcpy_s(m_szCalleeModName, 20, pszCalleeModName);
  233. strcpy_s(m_szFuncName, 30, pszFuncName);
  234. #else
  235. strcpy(m_szCalleeModName, pszCalleeModName);
  236. strcpy(m_szFuncName, pszFuncName);
  237. #endif
  238. if (sm_pfnAfxWndProc == NULL)
  239. {
  240. sm_pfnAfxWndProc = (FARPROC)AfxGetAfxWndProc();
  241. }
  242. if (sm_pvMaxAppAddr == NULL)
  243. {
  244. //
  245. // Functions with address above lpMaximumApplicationAddress require
  246. // special processing (Windows 9x only)
  247. //
  248. SYSTEM_INFO si;
  249. GetSystemInfo(&si);
  250. sm_pvMaxAppAddr = si.lpMaximumApplicationAddress;
  251. }
  252. if (m_pfnOrig > sm_pvMaxAppAddr)
  253. {
  254. //
  255. // The address is in a shared DLL; the address needs fixing up
  256. //
  257. PBYTE pb = (PBYTE) m_pfnOrig;
  258. if (pb[0] == cPushOpCode)
  259. {
  260. //
  261. // Skip over the PUSH op code and grab the real address
  262. //
  263. PVOID pv = * (PVOID*) &pb[1];
  264. m_pfnOrig = (PROC) pv;
  265. }
  266. }
  267. }
  268. CXTPSkinManagerApiFunction::~CXTPSkinManagerApiFunction()
  269. {
  270. UnhookImport();
  271. }
  272. BOOL CXTPSkinManagerApiFunction::HookImport()
  273. {
  274. return m_bHooked = ReplaceInAllModules(m_szCalleeModName, m_pfnOrig, m_pfnHook);
  275. }
  276. BOOL CXTPSkinManagerApiFunction::UnhookImport()
  277. {
  278. if (m_bHooked)
  279. {
  280. ReplaceInAllModules(m_szCalleeModName, m_pfnHook, m_pfnOrig);
  281. m_bHooked = FALSE;
  282. }
  283. return !m_bHooked;
  284. }
  285. BOOL CXTPSkinManagerApiFunction::ReplaceInAllModules(LPCSTR pszCalleeModName,
  286. PROC pfnCurrent, PROC pfnNew)
  287. {
  288. BOOL bResult = FALSE;
  289. if ((NULL != pfnCurrent) && (NULL != pfnNew))
  290. {
  291. HINSTANCE hInstance = AfxGetInstanceHandle();
  292. CXTPSkinManagerModuleList moduleList(::GetCurrentProcessId());
  293. HMODULE hModule = moduleList.GetFirstModule();
  294. while (hModule)
  295. {
  296. #ifdef _DEBUG
  297. TCHAR fn[MAX_PATH];
  298. GetModuleFileName(hModule, fn, MAX_PATH);
  299. #endif
  300. if ((hModule != hInstance) && !m_pApiHook->IsModuleExcluded(hModule))
  301. {
  302. if (ReplaceInOneModule(pszCalleeModName, pfnCurrent, pfnNew, hModule))
  303. {
  304. bResult = TRUE;
  305. }
  306. }
  307. hModule = moduleList.GetNextModule();
  308. }
  309. if (ReplaceInOneModule(pszCalleeModName, pfnCurrent, pfnNew, hInstance))
  310. {
  311. bResult = TRUE;
  312. }
  313. }
  314. return bResult;
  315. }
  316. BOOL CXTPSkinManagerApiFunction::ReplaceInOneModule(LPCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller)
  317. {
  318. if (pfnCurrent == NULL || pfnNew == NULL)
  319. return FALSE;
  320. CXTPLockGuard lock(m_pApiHook->m_cs);
  321. try
  322. {
  323. ULONG ulSize;
  324. // Get the address of the module's import section
  325. PIMAGE_IMPORT_DESCRIPTOR pImportDesc =
  326. (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(
  327. hmodCaller,
  328. TRUE,
  329. IMAGE_DIRECTORY_ENTRY_IMPORT,
  330. &ulSize
  331. );
  332. // Does this module has import section ?
  333. if (pImportDesc == NULL)
  334. return FALSE;
  335. while (pImportDesc != NULL)
  336. {
  337. // Loop through all descriptors and
  338. // find the import descriptor containing references to callee's functions
  339. while (pImportDesc->Name)
  340. {
  341. LPCSTR lpszName = ((LPCSTR)((PBYTE) hmodCaller + pImportDesc->Name));
  342. if (XTPCompareStringNoCase(lpszName, pszCalleeModName) == 0)
  343. break;   // Found
  344. pImportDesc++;
  345. } // while
  346. // Does this module import any functions from this callee ?
  347. if (pImportDesc->Name == 0)
  348. return FALSE;
  349. PIMAGE_THUNK_DATA pThunk =
  350. (PIMAGE_THUNK_DATA)( (PBYTE) hmodCaller + (UINT_PTR)pImportDesc->FirstThunk );
  351. while (pThunk->u1.Function)
  352. {
  353. PROC* ppfn = (PROC*) &pThunk->u1.Function;
  354. BOOL bFound = (*ppfn == pfnCurrent);
  355. if (!bFound && (*ppfn > sm_pvMaxAppAddr))
  356. {
  357. PBYTE pbInFunc = (PBYTE) *ppfn;
  358. // Is this a wrapper (debug thunk) represented by PUSH instruction?
  359. if (pbInFunc[0] == cPushOpCode)
  360. {
  361. ppfn = (PROC*) &pbInFunc[1];
  362. bFound = (*ppfn == pfnCurrent);
  363. }
  364. }
  365. if (bFound)
  366. {
  367. MEMORY_BASIC_INFORMATION mbi;
  368. ::VirtualQuery(ppfn, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
  369. // In order to provide writable access to this part of the
  370. // memory we need to change the memory protection
  371. if (!::VirtualProtect(mbi.BaseAddress, mbi.RegionSize,
  372. PAGE_READWRITE, &mbi.Protect))
  373. {
  374. return FALSE;
  375. }
  376. // Hook the function.
  377. *ppfn = *pfnNew;
  378. // Restore the protection back
  379. DWORD dwOldProtect;
  380. ::VirtualProtect(mbi.BaseAddress, mbi.RegionSize,
  381. mbi.Protect, &dwOldProtect);
  382. return TRUE;
  383. }
  384. pThunk++;
  385. }
  386. pImportDesc++;
  387. }
  388. }
  389. catch(...)
  390. {
  391. // do nothing
  392. }
  393. return FALSE;
  394. }
  395. void CXTPSkinManagerApiHook::InitializeHookManagement()
  396. {
  397. if (m_bInitialized)
  398. return;
  399. for (int i = 0; i < (int)m_arrExcludedModules.GetSize(); i++)
  400. {
  401. m_arrExcludedModules[i].hModule = GetModuleHandle(m_arrExcludedModules[i].strModule);
  402. }
  403. #define ADDHOOK(Dll, ProcName) 
  404. HookImport(xtpSkinApi##ProcName, Dll, #ProcName, (PROC)&CXTPSkinManagerApiHook::OnHook##ProcName)
  405. ADDHOOK("KERNEL32.DLL", LoadLibraryA);
  406. ADDHOOK("KERNEL32.DLL", LoadLibraryW);
  407. ADDHOOK("KERNEL32.DLL", LoadLibraryExA);
  408. ADDHOOK("KERNEL32.DLL", LoadLibraryExW);
  409. ADDHOOK("KERNEL32.DLL", GetProcAddress);
  410. ADDHOOK("KERNEL32.DLL", GetModuleHandleA);
  411. ADDHOOK("KERNEL32.DLL", CreateThread);
  412. ADDHOOK("USER32.DLL", RegisterClassA);
  413. ADDHOOK("USER32.DLL", RegisterClassW);
  414. if (XTPSkinManager()->GetApplyOptions() & xtpSkinApplyColors)
  415. {
  416. ADDHOOK("USER32.DLL", GetSysColor);
  417. ADDHOOK("USER32.DLL", GetSysColorBrush);
  418. ADDHOOK("USER32.DLL", DrawEdge);
  419. ADDHOOK("USER32.DLL", FillRect);
  420. ADDHOOK("GDI32.DLL", DeleteObject);
  421. ADDHOOK("UXTHEME.DLL", OpenThemeData);
  422. ADDHOOK("UXTHEME.DLL", DrawThemeBackground);
  423. ADDHOOK("UXTHEME.DLL", CloseThemeData);
  424. ADDHOOK("UXTHEME.DLL", GetThemeColor);
  425. ADDHOOK("UXTHEME.DLL", IsAppThemed);
  426. ADDHOOK("UXTHEME.DLL", IsThemeActive);
  427. ADDHOOK("UXTHEME.DLL", GetCurrentThemeName);
  428. ADDHOOK("UXTHEME.DLL", GetThemeSysBool);
  429. ADDHOOK("UXTHEME.DLL", GetThemeSysColor);
  430. ADDHOOK("UXTHEME.DLL", GetThemePartSize);
  431. ADDHOOK("USER32.DLL", DrawFrameControl);
  432. }
  433. if (XTPSkinManager()->GetApplyOptions() & xtpSkinApplyFrame)
  434. {
  435. ADDHOOK("USER32.DLL", SetScrollInfo);
  436. ADDHOOK("USER32.DLL", SetScrollPos);
  437. ADDHOOK("USER32.DLL", GetScrollInfo);
  438. ADDHOOK("USER32.DLL", EnableScrollBar);
  439. }
  440. if (XTPSkinManager()->GetApplyOptions() & xtpSkinApplyMetrics)
  441. {
  442. HookImport(xtpSkinApiSystemParametersInfo, "USER32.DLL", lpszSystemParametersInfo, (PROC)&CXTPSkinManagerApiHook::OnHookSystemParametersInfo);
  443. ADDHOOK("USER32.DLL", AdjustWindowRectEx);
  444. }
  445. ADDHOOK("USER32.DLL", DefWindowProcA);
  446. ADDHOOK("USER32.DLL", DefWindowProcW);
  447. ADDHOOK("USER32.DLL", DefFrameProcA);
  448. ADDHOOK("USER32.DLL", DefFrameProcW);
  449. ADDHOOK("USER32.DLL", DefDlgProcA);
  450. ADDHOOK("USER32.DLL", DefDlgProcW);
  451. ADDHOOK("USER32.DLL", DefMDIChildProcA);
  452. ADDHOOK("USER32.DLL", DefMDIChildProcW);
  453. ADDHOOK("USER32.DLL", CallWindowProcA);
  454. ADDHOOK("USER32.DLL", CallWindowProcW);
  455. m_bInitialized = TRUE;
  456. }
  457. void CXTPSkinManagerApiHook::FinalizeHookManagement()
  458. {
  459. if (!m_bInitialized)
  460. return;
  461. UnhookAllFunctions();
  462. m_bInitialized = FALSE;
  463. }
  464. DWORD WINAPI CXTPSkinManagerApiHook::OnHookGetSysColor(int nIndex)
  465. {
  466. typedef int(WINAPI* LPFNGETSYSCOLOR)(int);
  467. CXTPSkinManagerMetrics* pMetrics = XTPSkinManager()->GetMetrics();
  468. if (XTPSkinManager()->IsEnabled() && nIndex < XTP_SKINMETRICS_COLORTABLESIZE && pMetrics->m_clrTheme[nIndex] != -1)
  469. return pMetrics->m_clrTheme[nIndex];
  470. PROC pfnOrig = GetOriginalProc(xtpSkinApiGetSysColor);
  471. DWORD nResult = pfnOrig ? ((LPFNGETSYSCOLOR)pfnOrig)(nIndex) : GetSysColor(nIndex);
  472. return nResult;
  473. }
  474. BOOL WINAPI CXTPSkinManagerApiHook::OnHookDeleteObject(HGDIOBJ hObject)
  475. {
  476. typedef BOOL (WINAPI* LPFNDELETEOBJECT)(HGDIOBJ);
  477. CXTPSkinManagerMetrics* pMetrics = XTPSkinManager()->GetMetrics();
  478. if (pMetrics->IsMetricObject(hObject))
  479. return FALSE;
  480. PROC pfnOrig = GetOriginalProc(xtpSkinApiDeleteObject);
  481. return pfnOrig ? ((LPFNDELETEOBJECT)pfnOrig)(hObject) : DeleteObject(hObject);
  482. }
  483. HBRUSH WINAPI CXTPSkinManagerApiHook::OnHookGetSysColorBrush(  int nIndex)
  484. {
  485. typedef HBRUSH (WINAPI* LPFNGETSYSCOLORBRUSH)(int);
  486. CXTPSkinManagerMetrics* pMetrics = XTPSkinManager()->GetMetrics();
  487. if (XTPSkinManager()->IsEnabled() && nIndex > 0 && nIndex < XTP_SKINMETRICS_COLORTABLESIZE && pMetrics->m_brTheme[nIndex])
  488. {
  489. return pMetrics->m_brTheme[nIndex];
  490. }
  491. PROC pfnOrig = GetOriginalProc(xtpSkinApiGetSysColorBrush);
  492. HBRUSH nResult = pfnOrig ? ((LPFNGETSYSCOLORBRUSH)pfnOrig)(nIndex) : GetSysColorBrush(nIndex);
  493. return nResult;
  494. }
  495. int WINAPI CXTPSkinManagerApiHook::OnHookSetScrollPos( HWND hwnd,  int nBar,   int nPos,  BOOL redraw)
  496. {
  497. typedef int(WINAPI* LPFNSETSCROLLPOS)(  HWND hWnd,  int nBar,  int nPos,  BOOL bRedraw);
  498. PROC pfnOrig = GetOriginalProc(xtpSkinApiSetScrollPos);
  499. if (!pfnOrig)
  500. return SetScrollPos(hwnd, nBar, nPos, redraw);
  501. CXTPSkinObjectFrame* pFrame = (CXTPSkinObjectFrame*)XTPSkinManager()->Lookup(hwnd);
  502. if (!pFrame)
  503. return pfnOrig ? ((LPFNSETSCROLLPOS)pfnOrig)(hwnd, nBar, nPos, redraw) : 0;
  504. int nResult = pfnOrig ? ((LPFNSETSCROLLPOS)pfnOrig)(hwnd, nBar, nPos, FALSE) : 0;
  505. if (redraw)
  506. {
  507. if (nBar == SB_CTL) InvalidateRect(hwnd, NULL, FALSE);
  508. else pFrame->RedrawScrollBar(nBar);
  509. }
  510. return nResult;
  511. }
  512. int WINAPI CXTPSkinManagerApiHook::OnHookSetScrollInfo( HWND hwnd,  int nBar,  LPCSCROLLINFO lpsi,  BOOL redraw)
  513. {
  514. typedef int(WINAPI* LPFNSETSCROLLINFO)(HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, BOOL fRedraw);
  515. PROC pfnOrig = GetOriginalProc(xtpSkinApiSetScrollInfo);
  516. if (!pfnOrig)
  517. return SetScrollInfo(hwnd, nBar, lpsi, redraw);
  518. CXTPSkinObjectFrame* pFrame = (CXTPSkinObjectFrame*)XTPSkinManager()->Lookup(hwnd);
  519. if (!pFrame || (nBar == SB_CTL) || !redraw)
  520. return ((LPFNSETSCROLLINFO)pfnOrig)(hwnd, nBar, lpsi, redraw);
  521. int nResult = ((LPFNSETSCROLLINFO)pfnOrig)(hwnd, nBar, lpsi, FALSE);
  522. pFrame->RedrawScrollBar(nBar);
  523. return nResult;
  524. }
  525. BOOL WINAPI CXTPSkinManagerApiHook::OnHookEnableScrollBar(HWND hWnd, UINT wSBflags, UINT wArrows)
  526. {
  527. typedef int(WINAPI* LPFNENABLESCROLLBAR)(HWND hWnd, UINT wSBflags, UINT wArrows);
  528. PROC pfnOrig = GetOriginalProc(xtpSkinApiEnableScrollBar);
  529. if (!pfnOrig)
  530. return EnableScrollBar(hWnd, wSBflags, wArrows);
  531. CXTPSkinObjectFrame* pFrame = (CXTPSkinObjectFrame*)XTPSkinManager()->Lookup(hWnd);
  532. if (!pFrame)
  533. return pfnOrig ? ((LPFNENABLESCROLLBAR)pfnOrig)(hWnd, wSBflags, wArrows) : 0;
  534. int nResult = pfnOrig ? ((LPFNENABLESCROLLBAR)pfnOrig)(hWnd, wSBflags, wArrows) : 0;
  535. if (wSBflags == SB_BOTH || wSBflags == SB_HORZ)
  536. pFrame->RedrawScrollBar(SB_HORZ);
  537. if (wSBflags == SB_BOTH || wSBflags == SB_VERT)
  538. pFrame->RedrawScrollBar(SB_VERT);
  539. return nResult;
  540. }
  541. BOOL WINAPI CXTPSkinManagerApiHook::OnHookGetScrollInfo(HWND hWnd, int nBar, LPSCROLLINFO lpsi)
  542. {
  543. typedef BOOL(WINAPI* LPFNGETSCROLLINFO)(HWND hwnd, int nBar, LPCSCROLLINFO lpsi);
  544. PROC pfnOrig = GetOriginalProc(xtpSkinApiGetScrollInfo);
  545. if (!pfnOrig)
  546. return GetScrollInfo(hWnd, nBar, lpsi);
  547. BOOL nResult = pfnOrig ? ((LPFNGETSCROLLINFO)pfnOrig)(hWnd, nBar, lpsi) : FALSE;
  548. if (lpsi && (lpsi->fMask & SIF_TRACKPOS))
  549. {
  550. CXTPSkinObject* pSink = XTPSkinManager()->Lookup(hWnd);
  551. if (pSink)
  552. {
  553. XTP_SKINSCROLLBARTRACKINFO* pSBTrack = ((CXTPSkinObjectFrame*)pSink)->GetScrollBarTrackInfo();
  554. if (pSBTrack && (pSBTrack->nBar == nBar))
  555. {
  556. // posNew is in the context of psbiSB's window and bar code
  557. lpsi->nTrackPos = pSBTrack->posNew;
  558. }
  559. }
  560. }
  561. return nResult;
  562. }
  563. BOOL CXTPSkinManagerApiHook::IsSystemWindowModule(WNDPROC lpWndProc)
  564. {
  565. if ((HIWORD((ULONG)(ULONG_PTR)lpWndProc)) == 0xFFFF)
  566. return TRUE;
  567. static XTP_MODULEINFO miUser32 = {(LPVOID)-1, 0, 0, 0};
  568. if (miUser32.lpBaseOfDll == (LPVOID)-1)
  569. {
  570. HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));
  571. miUser32.hModule = hUser32;
  572. if (hUser32)
  573. {
  574. CXTPSkinManagerModuleList moduleList(::GetCurrentProcessId());
  575. moduleList.GetModuleInformation(hUser32, &miUser32);
  576. }
  577. }
  578. if ((LPBYTE)lpWndProc > (LPBYTE)miUser32.lpBaseOfDll
  579. && (LPBYTE)lpWndProc < (LPBYTE)miUser32.lpBaseOfDll + miUser32.SizeOfImage)
  580. return TRUE;
  581. static XTP_MODULEINFO miComCtrl32  = {(LPVOID)-1, 0, (LPVOID)-1, 0};
  582. HMODULE hComCtl32 = GetModuleHandle(_T("COMCTL32.DLL"));
  583. if (hComCtl32 && (miComCtrl32.lpBaseOfDll == (LPVOID)-1 || miComCtrl32.hModule != hComCtl32 ))
  584. {
  585. miComCtrl32.hModule = hComCtl32;
  586. CXTPSkinManagerModuleList moduleList(::GetCurrentProcessId());
  587. moduleList.GetModuleInformation(hComCtl32, &miComCtrl32);
  588. }
  589. if ((LPBYTE)lpWndProc > (LPBYTE)miComCtrl32.lpBaseOfDll
  590. && (LPBYTE)lpWndProc < (LPBYTE)miComCtrl32.lpBaseOfDll + miComCtrl32.SizeOfImage)
  591. return TRUE;
  592. if (XTPSystemVersion()->IsWinXPOrGreater())
  593. {
  594. static XTP_MODULEINFO miNtDll = {(LPVOID)-1, 0, 0, 0};
  595. if (miNtDll.lpBaseOfDll == (LPVOID)-1)
  596. {
  597. HMODULE hNtDLL = GetModuleHandle(_T("NTDLL.DLL"));
  598. miNtDll.hModule = hNtDLL;
  599. if (hNtDLL)
  600. {
  601. CXTPSkinManagerModuleList moduleList(::GetCurrentProcessId());
  602. moduleList.GetModuleInformation(hNtDLL, &miNtDll);
  603. }
  604. }
  605. if ((LPBYTE)lpWndProc > (LPBYTE)miNtDll.lpBaseOfDll
  606. && (LPBYTE)lpWndProc < (LPBYTE)miNtDll.lpBaseOfDll + miNtDll.SizeOfImage)
  607. return TRUE;
  608. }
  609. return FALSE;
  610. }
  611. BOOL CXTPSkinManagerApiHook::CallHookDefWindowProc(HWND hWnd, PROC pfnOrig, XTPSkinDefaultProc defProc, LPVOID lpPrev, UINT nMessage, WPARAM& wParam, LPARAM& lParam, LRESULT& lResult)
  612. {
  613. CXTPSkinManager* pSkinManager = XTPSkinManager();
  614. if (!pSkinManager->IsEnabled())
  615. return FALSE;
  616. CXTPSkinObject* pSkinObject = pSkinManager->Lookup(hWnd);
  617. if (!pSkinObject || pSkinObject->m_bCustomDraw)
  618. return FALSE;
  619. if (nMessage == pSkinObject->GetHeadMessage())
  620. return FALSE;
  621. if (nMessage == WM_NCDESTROY && pSkinObject->m_bWindowsForms)
  622. {
  623. pSkinObject->GetSkinManager()->Remove(hWnd, TRUE);
  624. return FALSE;
  625. }
  626. if (defProc == xtpSkinDefaultCallWindowProc && pSkinObject->IsDefWindowProcAvail(nMessage))
  627. {
  628. WNDPROC lpWndProc = (WNDPROC)lpPrev;
  629. if (IsSystemWindowModule(lpWndProc))
  630. {
  631. lpWndProc = 0;
  632. }
  633. if (lpWndProc != 0 && (!pSkinManager->IsWin9x() ||
  634. ((DWORD_PTR)lpWndProc < (DWORD_PTR)0x70000000)))
  635. {
  636. return FALSE;
  637. }
  638. }
  639. MSG& curMsg = AfxGetThreadState()->m_lastSentMsg;
  640. MSG  oldMsg = curMsg;
  641. curMsg.hwnd = hWnd;
  642. curMsg.message = nMessage;
  643. curMsg.wParam  = wParam;
  644. curMsg.lParam  = lParam;
  645. pSkinObject->OnBeginHook(nMessage, defProc, pfnOrig, lpPrev);
  646. BOOL bResult = pSkinObject->OnHookDefWindowProc(nMessage, wParam ,lParam, lResult);
  647. pSkinObject->OnEndHook();
  648. curMsg = oldMsg;
  649. if (bResult)
  650. return TRUE;
  651. return FALSE;
  652. }
  653. LRESULT WINAPI CXTPSkinManagerApiHook::OnHookCallWindowProcW(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  654. {
  655. PROC pfnOrig = GetOriginalProc(xtpSkinApiCallWindowProcW);
  656. if (!pfnOrig)
  657. return CallWindowProcW(lpPrevWndFunc, hWnd, Msg, wParam, lParam);
  658. LRESULT lResult = 0;
  659. if (lpPrevWndFunc && GetInstance()->CallHookDefWindowProc(hWnd, pfnOrig, xtpSkinDefaultCallWindowProc, lpPrevWndFunc, Msg, wParam ,lParam, lResult))
  660. {
  661. return lResult;
  662. }
  663. typedef LRESULT (WINAPI* LPFNCALLWINDOWPROC)(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  664. LRESULT bResult = ((LPFNCALLWINDOWPROC)pfnOrig)(lpPrevWndFunc, hWnd, Msg, wParam, lParam);
  665. return bResult;
  666. }
  667. LRESULT WINAPI CXTPSkinManagerApiHook::OnHookCallWindowProcA(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  668. {
  669. PROC pfnOrig = GetOriginalProc(xtpSkinApiCallWindowProcA);
  670. if (!pfnOrig)
  671. return CallWindowProcA(lpPrevWndFunc, hWnd, Msg, wParam, lParam);
  672. LRESULT lResult = 0;
  673. if (lpPrevWndFunc && GetInstance()->CallHookDefWindowProc(hWnd, pfnOrig, xtpSkinDefaultCallWindowProc, lpPrevWndFunc, Msg, wParam ,lParam, lResult))
  674. {
  675. return lResult;
  676. }
  677. typedef LRESULT (WINAPI* LPFNCALLWINDOWPROC)(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  678. LRESULT bResult = ((LPFNCALLWINDOWPROC)pfnOrig)(lpPrevWndFunc, hWnd, Msg, wParam, lParam);
  679. return bResult;
  680. }
  681. LRESULT WINAPI CXTPSkinManagerApiHook::OnHookDefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  682. {
  683. PROC pfnOrig = GetOriginalProc(xtpSkinApiDefWindowProcA);
  684. if (!pfnOrig)
  685. return DefWindowProcA(hWnd, Msg, wParam, lParam);
  686. LRESULT lResult = 0;
  687. if (GetInstance()->CallHookDefWindowProc(hWnd, pfnOrig, xtpSkinDefaultDefWindowProc, NULL, Msg, wParam ,lParam, lResult))
  688. {
  689. return lResult;
  690. }
  691. typedef LRESULT (WINAPI* LPFNDEFWINDOWPROC)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  692. return ((LPFNDEFWINDOWPROC)pfnOrig)(hWnd, Msg, wParam, lParam);
  693. }
  694. LRESULT WINAPI CXTPSkinManagerApiHook::OnHookDefWindowProcW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  695. {
  696. PROC pfnOrig = GetOriginalProc(xtpSkinApiDefWindowProcW);
  697. if (!pfnOrig)
  698. return DefWindowProcW(hWnd, Msg, wParam, lParam);
  699. LRESULT lResult = 0;
  700. if (GetInstance()->CallHookDefWindowProc(hWnd, pfnOrig, xtpSkinDefaultDefWindowProc, NULL, Msg, wParam ,lParam, lResult))
  701. {
  702. return lResult;
  703. }
  704. typedef LRESULT (WINAPI* LPFNDEFWINDOWPROC)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  705. return ((LPFNDEFWINDOWPROC)pfnOrig)(hWnd, Msg, wParam, lParam);
  706. }
  707. LRESULT WINAPI CXTPSkinManagerApiHook::OnHookDefFrameProcA(HWND hWnd, HWND hWndMDIClient, UINT Msg, WPARAM wParam, LPARAM lParam)
  708. {
  709. PROC pfnOrig = GetOriginalProc(xtpSkinApiDefFrameProcA);
  710. if (!pfnOrig)
  711. return DefFrameProcA(hWnd, hWndMDIClient, Msg, wParam, lParam);
  712. LRESULT lResult = 0;
  713. if (GetInstance()->CallHookDefWindowProc(hWnd, pfnOrig, xtpSkinDefaultDefFrameProc, (LPVOID)hWndMDIClient, Msg, wParam ,lParam, lResult))
  714. {
  715. return lResult;
  716. }
  717. typedef LRESULT (WINAPI* LPFNDEFWINDOWPROC)(HWND hWnd, HWND hWndMDIClient, UINT Msg, WPARAM wParam, LPARAM lParam);
  718. return ((LPFNDEFWINDOWPROC)pfnOrig)(hWnd, hWndMDIClient, Msg, wParam, lParam);
  719. }
  720. LRESULT WINAPI CXTPSkinManagerApiHook::OnHookDefFrameProcW(HWND hWnd, HWND hWndMDIClient, UINT Msg, WPARAM wParam, LPARAM lParam)
  721. {
  722. PROC pfnOrig = GetOriginalProc(xtpSkinApiDefFrameProcW);
  723. if (!pfnOrig)
  724. return DefFrameProcW(hWnd, hWndMDIClient, Msg, wParam, lParam);
  725. LRESULT lResult = 0;
  726. if (GetInstance()->CallHookDefWindowProc(hWnd, pfnOrig, xtpSkinDefaultDefFrameProc, (LPVOID)hWndMDIClient, Msg, wParam ,lParam, lResult))
  727. {
  728. return lResult;
  729. }
  730. typedef LRESULT (WINAPI* LPFNDEFWINDOWPROC)(HWND hWnd, HWND hWndMDIClient, UINT Msg, WPARAM wParam, LPARAM lParam);
  731. return ((LPFNDEFWINDOWPROC)pfnOrig)(hWnd, hWndMDIClient, Msg, wParam, lParam);
  732. }
  733. LRESULT WINAPI CXTPSkinManagerApiHook::OnHookDefDlgProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  734. {
  735. PROC pfnOrig = GetOriginalProc(xtpSkinApiDefDlgProcA);
  736. if (!pfnOrig)
  737. return DefDlgProcA(hWnd, Msg, wParam, lParam);
  738. LRESULT lResult = 0;
  739. if (GetInstance()->CallHookDefWindowProc(hWnd, pfnOrig, xtpSkinDefaultDefDlgProc, NULL, Msg, wParam ,lParam, lResult))
  740. {
  741. return lResult;
  742. }
  743. typedef LRESULT (WINAPI* LPFNDEFWINDOWPROC)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  744. return ((LPFNDEFWINDOWPROC)pfnOrig)(hWnd, Msg, wParam, lParam);
  745. }
  746. LRESULT WINAPI CXTPSkinManagerApiHook::OnHookDefDlgProcW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  747. {
  748. PROC pfnOrig = GetOriginalProc(xtpSkinApiDefDlgProcW);
  749. if (!pfnOrig)
  750. return DefDlgProcW(hWnd, Msg, wParam, lParam);
  751. LRESULT lResult = 0;
  752. if (GetInstance()->CallHookDefWindowProc(hWnd, pfnOrig, xtpSkinDefaultDefDlgProc, NULL, Msg, wParam ,lParam, lResult))
  753. {
  754. return lResult;
  755. }
  756. typedef LRESULT (WINAPI* LPFNDEFWINDOWPROC)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  757. return ((LPFNDEFWINDOWPROC)pfnOrig)(hWnd, Msg, wParam, lParam);
  758. }
  759. LRESULT WINAPI CXTPSkinManagerApiHook::OnHookDefMDIChildProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  760. {
  761. PROC pfnOrig = GetOriginalProc(xtpSkinApiDefMDIChildProcA);
  762. if (!pfnOrig)
  763. return DefMDIChildProcA(hWnd, Msg, wParam, lParam);
  764. LRESULT lResult = 0;
  765. if (GetInstance()->CallHookDefWindowProc(hWnd, pfnOrig, xtpSkinDefaultDefMDIChildProc, NULL, Msg, wParam ,lParam, lResult))
  766. {
  767. return lResult;
  768. }
  769. typedef LRESULT (WINAPI* LPFNDEFWINDOWPROC)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  770. return ((LPFNDEFWINDOWPROC)pfnOrig)(hWnd, Msg, wParam, lParam);
  771. }
  772. LRESULT WINAPI CXTPSkinManagerApiHook::OnHookDefMDIChildProcW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  773. {
  774. PROC pfnOrig = GetOriginalProc(xtpSkinApiDefMDIChildProcW);
  775. if (!pfnOrig)
  776. return DefMDIChildProcW(hWnd, Msg, wParam, lParam);
  777. LRESULT lResult = 0;
  778. if (GetInstance()->CallHookDefWindowProc(hWnd, pfnOrig, xtpSkinDefaultDefMDIChildProc, NULL, Msg, wParam ,lParam, lResult))
  779. {
  780. return lResult;
  781. }
  782. typedef LRESULT (WINAPI* LPFNDEFWINDOWPROC)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  783. return ((LPFNDEFWINDOWPROC)pfnOrig)(hWnd, Msg, wParam, lParam);
  784. }
  785. struct XTP_SKINFRAMEWORK_THREADPROCPARAMETER
  786. {
  787. LPTHREAD_START_ROUTINE lpStartAddress;
  788. LPVOID lpParameter;
  789. };
  790. DWORD WINAPI CXTPSkinManagerApiHook::ThreadProcHook(LPVOID lpThreadData)
  791. {
  792. XTP_SKINFRAMEWORK_THREADPROCPARAMETER* parameter = (XTP_SKINFRAMEWORK_THREADPROCPARAMETER*)lpThreadData;
  793. LPTHREAD_START_ROUTINE lpStartAddress = parameter->lpStartAddress;
  794. LPVOID lpParam = parameter->lpParameter;
  795. delete lpThreadData;
  796. XTPSkinManager()->EnableCurrentThread();
  797. return (lpStartAddress)(lpParam);
  798. }
  799. HANDLE STDAPICALLTYPE CXTPSkinManagerApiHook::OnHookCreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
  800. UINT_PTR dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,
  801. DWORD dwCreationFlags, LPDWORD lpThreadId)
  802. {
  803. typedef HANDLE (WINAPI* LPFNCREATETHREAD)(LPSECURITY_ATTRIBUTES lpThreadAttributes,
  804. UINT_PTR dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,
  805. DWORD dwCreationFlags, LPDWORD lpThreadId);
  806. PROC pfnOrig = GetOriginalProc(xtpSkinApiCreateThread);
  807. if (!pfnOrig)
  808. return CreateThread(lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId);
  809. if (XTPSkinManager()->IsEnabled() && XTPSkinManager()->GetAutoApplyNewThreads())
  810. {
  811. XTP_SKINFRAMEWORK_THREADPROCPARAMETER* pParam = new XTP_SKINFRAMEWORK_THREADPROCPARAMETER;
  812. pParam->lpParameter = lpParameter;
  813. pParam->lpStartAddress = lpStartAddress;
  814. return ((LPFNCREATETHREAD)pfnOrig)(lpThreadAttributes,
  815. dwStackSize, ThreadProcHook, pParam,
  816. dwCreationFlags, lpThreadId);
  817. }
  818. return ((LPFNCREATETHREAD)pfnOrig)(lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId);
  819. }
  820. ATOM WINAPI CXTPSkinManagerApiHook::OnHookRegisterClassA ( const WNDCLASSA *lpWndClass)
  821. {
  822. typedef ATOM(WINAPI* LPFNREGISTERCLASSA)(const WNDCLASSA* lpWndClass);
  823. PROC pfnOrig = GetOriginalProc(xtpSkinApiRegisterClassA);
  824. if (!pfnOrig)
  825. return RegisterClassA(lpWndClass);
  826. CXTPSkinManagerApiFunction* pDefWindowFunction = NULL;
  827. if (lpWndClass && lpWndClass->lpfnWndProc == (WNDPROC)&CXTPSkinManagerApiHook::OnHookDefWindowProcA)
  828. {
  829. pDefWindowFunction = GetInstance()->GetHookedFunction(xtpSkinApiDefWindowProcA);
  830. }
  831. if (lpWndClass && lpWndClass->lpfnWndProc == (WNDPROC)&CXTPSkinManagerApiHook::OnHookDefFrameProcA)
  832. {
  833. pDefWindowFunction = GetInstance()->GetHookedFunction(xtpSkinApiDefFrameProcA);
  834. }
  835. if (lpWndClass && lpWndClass->lpfnWndProc == (WNDPROC)&CXTPSkinManagerApiHook::OnHookDefMDIChildProcA)
  836. {
  837. pDefWindowFunction = GetInstance()->GetHookedFunction(xtpSkinApiDefMDIChildProcA);
  838. }
  839. if (lpWndClass && lpWndClass->lpfnWndProc == (WNDPROC)&CXTPSkinManagerApiHook::OnHookDefDlgProcA)
  840. {
  841. pDefWindowFunction = GetInstance()->GetHookedFunction(xtpSkinApiDefDlgProcA);
  842. }
  843. if (pDefWindowFunction)
  844. {
  845. WNDCLASSA wc;
  846. wc = *lpWndClass;
  847. wc.lpfnWndProc = (WNDPROC)pDefWindowFunction->m_pfnOrig;
  848. return ((LPFNREGISTERCLASSA)pfnOrig)(&wc);
  849. }
  850. return ((LPFNREGISTERCLASSA)pfnOrig)(lpWndClass);
  851. }
  852. ATOM WINAPI CXTPSkinManagerApiHook::OnHookRegisterClassW ( const WNDCLASSW *lpWndClass)
  853. {
  854. typedef ATOM(WINAPI* LPFNREGISTERCLASSW)(const WNDCLASSW* lpWndClass);
  855. PROC pfnOrig = GetOriginalProc(xtpSkinApiRegisterClassW);
  856. if (!pfnOrig)
  857. return RegisterClassW(lpWndClass);
  858. CXTPSkinManagerApiFunction* pDefWindowFunction = NULL;
  859. if (lpWndClass && lpWndClass->lpfnWndProc == (WNDPROC)&CXTPSkinManagerApiHook::OnHookDefWindowProcW)
  860. {
  861. pDefWindowFunction = GetInstance()->GetHookedFunction(xtpSkinApiDefWindowProcW);
  862. }
  863. if (lpWndClass && lpWndClass->lpfnWndProc == (WNDPROC)&CXTPSkinManagerApiHook::OnHookDefFrameProcW)
  864. {
  865. pDefWindowFunction = GetInstance()->GetHookedFunction(xtpSkinApiDefFrameProcW);
  866. }
  867. if (lpWndClass && lpWndClass->lpfnWndProc == (WNDPROC)&CXTPSkinManagerApiHook::OnHookDefMDIChildProcW)
  868. {
  869. pDefWindowFunction = GetInstance()->GetHookedFunction(xtpSkinApiDefMDIChildProcW);
  870. }
  871. if (lpWndClass && lpWndClass->lpfnWndProc == (WNDPROC)&CXTPSkinManagerApiHook::OnHookDefDlgProcW)
  872. {
  873. pDefWindowFunction = GetInstance()->GetHookedFunction(xtpSkinApiDefDlgProcW);
  874. }
  875. if (pDefWindowFunction)
  876. {
  877. WNDCLASSW wc;
  878. wc = *lpWndClass;
  879. wc.lpfnWndProc = (WNDPROC)pDefWindowFunction->m_pfnOrig;
  880. return ((LPFNREGISTERCLASSW)pfnOrig)(&wc);
  881. }
  882. return ((LPFNREGISTERCLASSW)pfnOrig)(lpWndClass);
  883. }
  884. BOOL WINAPI CXTPSkinManagerApiHook::OnHookSystemParametersInfo (UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
  885. {
  886. typedef BOOL(WINAPI* LPFNSYSTEMPARAMETERSINFO )(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni);
  887. PROC pfnOrig = GetOriginalProc(xtpSkinApiSystemParametersInfo);
  888. if (!pfnOrig)
  889. return SystemParametersInfo(uiAction, uiParam, pvParam, fWinIni);
  890. BOOL bResult = ((LPFNSYSTEMPARAMETERSINFO)pfnOrig)(uiAction, uiParam, pvParam, fWinIni);
  891. if (uiAction == SPI_GETICONTITLELOGFONT && uiParam == sizeof(LOGFONT))
  892. {
  893. LOGFONT* pLogFont = (LOGFONT*)pvParam;
  894. CXTPSkinManagerSchema* pSchema = XTPSkinManager()->GetSchema();
  895. UINT nSysMetrics = pSchema->GetClassCode(_T("SYSMETRICS"));
  896. pSchema->GetFontProperty(nSysMetrics, 0, 0, TMT_ICONTITLEFONT, *pLogFont);
  897. }
  898. if (uiAction == SPI_GETNONCLIENTMETRICS && uiParam == sizeof(NONCLIENTMETRICS))
  899. {
  900. NONCLIENTMETRICS* pncm = (NONCLIENTMETRICS*)pvParam;
  901. CXTPSkinManagerSchema* pSchema = XTPSkinManager()->GetSchema();
  902. UINT nSysMetrics = pSchema->GetClassCode(_T("SYSMETRICS"));
  903. pSchema->GetFontProperty(nSysMetrics, 0, 0, TMT_MENUFONT, pncm->lfMenuFont);
  904. pSchema->GetFontProperty(nSysMetrics, 0, 0, TMT_STATUSFONT, pncm->lfStatusFont);
  905. pSchema->GetFontProperty(nSysMetrics, 0, 0, TMT_CAPTIONFONT, pncm->lfCaptionFont);
  906. }
  907. return bResult;
  908. }
  909. BOOL WINAPI CXTPSkinManagerApiHook::OnHookAdjustWindowRectEx(LPRECT lpRect, DWORD dwStyle, BOOL bMenu, DWORD dwExStyle)
  910. {
  911. typedef BOOL (WINAPI* LPFNADJUSTWINDOWRECTEX)(LPRECT lpRect, DWORD dwStyle, BOOL bMenu, DWORD dwExStyle);
  912. PROC pfnOrig = GetOriginalProc(xtpSkinApiAdjustWindowRectEx);
  913. if (!pfnOrig)
  914. return AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle);
  915. CXTPSkinManager* pSkinManager = XTPSkinManager();
  916. if (lpRect && !bMenu && (pSkinManager->GetApplyOptions() & xtpSkinApplyMetrics) && (dwStyle & WS_THICKFRAME)
  917. && !(((dwStyle & (WS_CAPTION | WS_MAXIMIZE)) == (WS_CAPTION | WS_MAXIMIZE) && ((dwStyle & WS_CHILD) == 0))))
  918. {
  919. CRect rcBorders = pSkinManager->GetSchema()->CalcFrameBorders(dwStyle, dwExStyle);
  920. lpRect->top -= rcBorders.top;
  921. lpRect->left -= rcBorders.left;
  922. lpRect->right += rcBorders.right;
  923. lpRect->bottom += rcBorders.bottom;
  924. return TRUE;
  925. }
  926. BOOL bResult =((LPFNADJUSTWINDOWRECTEX)pfnOrig)(lpRect, dwStyle, bMenu, dwExStyle);
  927. if (bResult && ((dwStyle & WS_CAPTION) == WS_CAPTION) &&
  928. lpRect && (pSkinManager->GetApplyOptions() & xtpSkinApplyMetrics))
  929. {
  930. BOOL bSmallCaption = dwExStyle & WS_EX_TOOLWINDOW;
  931. CXTPSkinManagerMetrics* pMetrics = pSkinManager->GetMetrics();
  932. int cyCaption = bSmallCaption ? pMetrics->m_cySmallCaption : pMetrics->m_cyCaption;
  933. int cyOsCaption = bSmallCaption ? pMetrics->m_cyOsSmallCaption : pMetrics->m_cyOsCaption;
  934. lpRect->top -= cyCaption - cyOsCaption;
  935. }
  936. return bResult;
  937. }
  938. int WINAPI CXTPSkinManagerApiHook::OnHookFillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr)
  939. {
  940. typedef int (WINAPI* LPFNFILLRECT)(HDC hDC, CONST RECT *lprc, HBRUSH hbr);
  941. PROC pfnOrig = GetOriginalProc(xtpSkinApiFillRect);
  942. if (!pfnOrig)
  943. return ::FillRect(hDC, lprc, hbr);
  944. if ((DWORD_PTR)hbr > 0 && (DWORD_PTR)hbr < XTP_SKINMETRICS_COLORTABLESIZE)
  945. {
  946. hbr = XTPSkinManager()->GetMetrics()->m_brTheme[(DWORD_PTR)hbr - 1];
  947. }
  948. if (pfnOrig)
  949. {
  950. return ((LPFNFILLRECT)pfnOrig)(hDC, lprc, hbr);
  951. }
  952. return 0;
  953. }
  954. BOOL WINAPI CXTPSkinManagerApiHook::OnHookDrawEdge(HDC hdc, LPRECT lprc, UINT edge, UINT flags)
  955. {
  956. PROC pfnOrig = GetOriginalProc(xtpSkinApiDrawEdge);
  957. if (!pfnOrig)
  958. return DrawEdge(hdc, lprc, edge, flags);
  959. return XTRSkinFrameworkDrawEdge(hdc, lprc, edge, flags);
  960. }
  961. BOOL WINAPI CXTPSkinManagerApiHook::OnHookDrawFrameControl(HDC hdc, LPRECT lprc, UINT uType, UINT uState)
  962. {
  963. typedef BOOL (WINAPI* LPFNDRAWFRAMECONTROL)(HDC, LPRECT, UINT, UINT);
  964. PROC pfnOrig = GetOriginalProc(xtpSkinApiDrawFrameControl);
  965. if (!pfnOrig)
  966. return DrawFrameControl(hdc, lprc, uType, uState);
  967. if (XTRSkinFrameworkDrawFrameControl(hdc, lprc, uType, uState))
  968. return TRUE;
  969. return ((LPFNDRAWFRAMECONTROL)pfnOrig)(hdc, lprc, uType, uState);
  970. }
  971. void CXTPSkinManagerApiHook::HackModuleOnLoad(HMODULE hmod, DWORD dwFlags)
  972. {
  973. for (int i = 0; i < (int)m_arrExcludedModules.GetSize(); i++)
  974. {
  975. EXCLUDEDMODULE& em = m_arrExcludedModules[i];
  976. if (em.hModule == NULL) em.hModule = GetModuleHandle(em.strModule);
  977. }
  978. if (IsModuleExcluded(hmod))
  979. return;
  980. if ((hmod != NULL) && ((dwFlags & LOAD_LIBRARY_AS_DATAFILE) == 0))
  981. {
  982. for (int i = 0; i < XTP_SKIN_APIHOOKCOUNT; i++)
  983. {
  984. CXTPSkinManagerApiFunction* pHook = m_arrFunctions[i];
  985. if (pHook)
  986. {
  987. if (pHook->ReplaceInOneModule(pHook->m_szCalleeModName, pHook->m_pfnOrig, pHook->m_pfnHook, hmod))
  988. {
  989. pHook->m_bHooked = TRUE;
  990. }
  991. }
  992. }
  993. }
  994. }
  995. HMODULE WINAPI CXTPSkinManagerApiHook::OnHookLoadLibraryA(LPCSTR pszModuleName)
  996. {
  997. typedef HMODULE (WINAPI* LPFNLOADLIBRARYA)(LPCSTR pszModuleName);
  998. PROC pfnOrig = GetOriginalProc(xtpSkinApiLoadLibraryA);
  999. if (!pfnOrig)
  1000. return ::LoadLibraryA(pszModuleName);
  1001. HMODULE hmod = ((LPFNLOADLIBRARYA)pfnOrig)(pszModuleName);
  1002. GetInstance()->HackModuleOnLoad(hmod, 0);
  1003. return hmod;
  1004. }
  1005. HMODULE WINAPI CXTPSkinManagerApiHook::OnHookLoadLibraryW(PCWSTR pszModuleName)
  1006. {
  1007. typedef HMODULE (WINAPI* LPFNLOADLIBRARYW)(PCWSTR pszModuleName);
  1008. PROC pfnOrig = GetOriginalProc(xtpSkinApiLoadLibraryW);
  1009. if (!pfnOrig)
  1010. return ::LoadLibraryW(pszModuleName);
  1011. HMODULE hmod = ((LPFNLOADLIBRARYW)pfnOrig)(pszModuleName);
  1012. GetInstance()->HackModuleOnLoad(hmod, 0);
  1013. return hmod;
  1014. }
  1015. HMODULE WINAPI CXTPSkinManagerApiHook::OnHookLoadLibraryExA(LPCSTR  pszModuleName, HANDLE hFile, DWORD dwFlags)
  1016. {
  1017. typedef HMODULE (WINAPI* LPFNLOADLIBRARYEXA)(LPCSTR pszModuleName, HANDLE hFile, DWORD dwFlags);
  1018. PROC pfnOrig = GetOriginalProc(xtpSkinApiLoadLibraryExA);
  1019. if (!pfnOrig)
  1020. return ::LoadLibraryExA(pszModuleName, hFile, dwFlags);
  1021. HMODULE hmod = ((LPFNLOADLIBRARYEXA)pfnOrig)(pszModuleName, hFile, dwFlags);
  1022. GetInstance()->HackModuleOnLoad(hmod, 0);
  1023. return hmod;
  1024. }
  1025. HMODULE WINAPI CXTPSkinManagerApiHook::OnHookLoadLibraryExW(PCWSTR pszModuleName, HANDLE hFile, DWORD dwFlags)
  1026. {
  1027. typedef HMODULE (WINAPI* LPFNLOADLIBRARYEXW)(PCWSTR pszModuleName, HANDLE hFile, DWORD dwFlags);
  1028. PROC pfnOrig = GetOriginalProc(xtpSkinApiLoadLibraryExW);
  1029. if (!pfnOrig)
  1030. return ::LoadLibraryExW(pszModuleName, hFile, dwFlags);
  1031. HMODULE hmod = ((LPFNLOADLIBRARYEXW)pfnOrig)(pszModuleName, hFile, dwFlags);
  1032. GetInstance()->HackModuleOnLoad(hmod, dwFlags);
  1033. return hmod;
  1034. }
  1035. HMODULE WINAPI CXTPSkinManagerApiHook::OnHookGetModuleHandleA(LPCSTR lpModuleName)
  1036. {
  1037. if (lpModuleName && XTPCompareStringNoCase(lpModuleName, "UxTheme.dll") == 0)
  1038. if (XTPSkinManager()->GetApplyOptions() & xtpSkinApplyColors)
  1039. return XTP_UXTHEME_HANDLE;
  1040. typedef HMODULE (WINAPI* LPFNGETMODULEHANDLEA)(LPCSTR lpModuleName);
  1041. PROC pfnOrig = GetOriginalProc(xtpSkinApiGetModuleHandleA);
  1042. if (pfnOrig)
  1043. return ((LPFNGETMODULEHANDLEA)pfnOrig)(lpModuleName);
  1044. return ::GetModuleHandleA(lpModuleName);
  1045. }
  1046. FARPROC WINAPI CXTPSkinManagerApiHook::OnHookGetProcAddress(HMODULE hmod, PCSTR pszProcName)
  1047. {
  1048. if ((DWORD_PTR)pszProcName < 0xFFFF)
  1049. return GetProcAddressWindows(hmod, pszProcName);
  1050. CXTPSkinManagerApiFunction* pFuncHook = NULL;
  1051. if (hmod == XTP_UXTHEME_HANDLE)
  1052. {
  1053. pFuncHook = GetInstance()->GetHookedFunction("UXTHEME.DLL", pszProcName);
  1054. }
  1055. else
  1056. {
  1057. char szFullFileName[MAX_PATH];
  1058. ::GetModuleFileNameA(hmod, szFullFileName, MAX_PATH);
  1059. // We must extract only the name and the extension
  1060. char* szFileName = strrchr(szFullFileName, '\');
  1061. if (szFileName == NULL)
  1062. szFileName = szFullFileName;
  1063. else
  1064. szFileName = szFileName + 1;
  1065. if (XTPCompareStringNoCase(szFileName, "UxTheme.dll") == 0)
  1066. return GetProcAddressWindows(hmod, pszProcName);
  1067. pFuncHook = GetInstance()->GetHookedFunction(szFileName, pszProcName);
  1068. }
  1069. if (pFuncHook)
  1070. return pFuncHook->m_pfnHook;
  1071. return GetProcAddressWindows(hmod, pszProcName);
  1072. }
  1073. HTHEME STDAPICALLTYPE CXTPSkinManagerApiHook::OnHookOpenThemeData(HWND /*hWnd*/, LPCWSTR pszClassList)
  1074. {
  1075. CXTPSkinManager* pManager = XTPSkinManager();
  1076. if (!pManager->IsEnabled())
  1077. return 0;
  1078. CXTPSkinManagerClass* pClass = pManager->GetSkinClass(CString(pszClassList));
  1079. return (HTHEME)pClass;
  1080. }
  1081. HRESULT STDAPICALLTYPE CXTPSkinManagerApiHook::OnHookDrawThemeBackground(HTHEME hTheme, HDC hDC, int iPartId, int iStateId, const RECT* pRect, const RECT* pClipRect)
  1082. {
  1083. if (!hTheme)
  1084. return E_FAIL;
  1085. CXTPSkinManagerClass* pClass = XTPSkinManager()->FromHandle(hTheme);
  1086. if (!pClass)
  1087. return E_FAIL;
  1088. HRGN hrgnClip = 0;
  1089. if (pClipRect && pRect && !EqualRect(pClipRect, pRect))
  1090. {
  1091. hrgnClip = CreateRectRgn(0, 0, 0, 0);
  1092. if (hrgnClip != NULL)
  1093. {
  1094. if (GetClipRgn(hDC, hrgnClip) != 1)
  1095. {
  1096. DeleteObject(hrgnClip);
  1097. hrgnClip = (HRGN)-1;
  1098. }
  1099. ::IntersectClipRect(hDC, pClipRect->left, pClipRect->top, pClipRect->right, pClipRect->bottom);
  1100. }
  1101. }
  1102. HRESULT hResult = S_OK;
  1103. if (!pClass->DrawThemeBackground(CDC::FromHandle(hDC), iPartId, iStateId, pRect))
  1104. hResult = E_FAIL;
  1105. if (hrgnClip != NULL)
  1106. {
  1107. if (hrgnClip == (HRGN)-1)
  1108. {
  1109. ExtSelectClipRgn(hDC, NULL, RGN_COPY);
  1110. }
  1111. else
  1112. {
  1113. ExtSelectClipRgn(hDC, hrgnClip, RGN_COPY);
  1114. DeleteObject(hrgnClip);
  1115. }
  1116. }
  1117. return hResult;
  1118. }
  1119. HRESULT STDAPICALLTYPE CXTPSkinManagerApiHook::OnHookCloseThemeData(HTHEME)
  1120. {
  1121. return S_OK;
  1122. }
  1123. HRESULT STDAPICALLTYPE CXTPSkinManagerApiHook::OnHookGetThemeColor(HTHEME hTheme, int iPartId, int iStateId, int iPropID, COLORREF *pColor)
  1124. {
  1125. if (!hTheme)
  1126. return E_FAIL;
  1127. CXTPSkinManagerClass* pClass = XTPSkinManager()->FromHandle(hTheme);
  1128. if (!pClass)
  1129. return E_FAIL;
  1130. COLORREF clr = pClass->GetThemeColor(iPartId, iStateId, iPropID);
  1131. if (clr == COLORREF_NULL)
  1132. return E_FAIL;
  1133. *pColor = clr;
  1134. return S_OK;
  1135. }
  1136. BOOL STDAPICALLTYPE CXTPSkinManagerApiHook::OnHookIsThemeActive()
  1137. {
  1138. return TRUE;
  1139. }
  1140. BOOL STDAPICALLTYPE CXTPSkinManagerApiHook::OnHookIsAppThemed()
  1141. {
  1142. return TRUE;
  1143. }
  1144. HRESULT STDAPICALLTYPE CXTPSkinManagerApiHook::OnHookGetThemePartSize(HTHEME hTheme, HDC, int iPartId, int iStateId, RECT *pRect, THEMESIZE eSize, SIZE* pSize)
  1145. {
  1146. if (!hTheme)
  1147. return E_FAIL;
  1148. CXTPSkinManagerClass* pClass = XTPSkinManager()->FromHandle(hTheme);
  1149. if (!pClass)
  1150. return E_FAIL;
  1151. if (!pClass->GetThemePartSize(iPartId, iStateId, pRect, eSize, pSize))
  1152. return E_FAIL;
  1153. return S_OK;
  1154. }
  1155. BOOL STDAPICALLTYPE CXTPSkinManagerApiHook::OnHookGetThemeSysBool(HTHEME /*hTheme*/, int iBoolId)
  1156. {
  1157. return XTPSkinManager()->GetThemeSysBool(iBoolId);
  1158. }
  1159. COLORREF STDAPICALLTYPE CXTPSkinManagerApiHook::OnHookGetThemeSysColor(HTHEME /*hTheme*/, int iColorId)
  1160. {
  1161. return XTPSkinManager()->GetThemeSysColor(iColorId);
  1162. }
  1163. HRESULT STDAPICALLTYPE CXTPSkinManagerApiHook::OnHookGetCurrentThemeName(LPWSTR pszThemeFileName, int dwMaxNameChars, LPWSTR pszColorBuff, int cchMaxColorChars, LPWSTR /*pszSizeBuff*/, int /*cchMaxSizeChars*/)
  1164. {
  1165. CXTPSkinManager* pManager = XTPSkinManager();
  1166. if (!pManager->GetResourceFile())
  1167. return E_FAIL;
  1168. if (pszThemeFileName)
  1169. {
  1170. CString strThemeFileName = pManager->GetResourceFile()->GetResourcePath();
  1171. int nLength = strThemeFileName.GetLength();
  1172. if (nLength < dwMaxNameChars)
  1173. {
  1174. MBSTOWCS_S(pszThemeFileName, strThemeFileName, nLength + 1);
  1175. }
  1176. }
  1177. if (pszColorBuff)
  1178. {
  1179. CString strColorBuff = pManager->GetResourceFile()->GetIniFileName();
  1180. strColorBuff.MakeUpper();
  1181. if (strColorBuff.Find(_T("METALLIC")) > 0) strColorBuff = _T("metallic");
  1182. if (strColorBuff.Find(_T("BLUE"))  > 0) strColorBuff = _T("normalcolor");
  1183. if (strColorBuff.Find(_T("HOMESTEAD"))  > 0) strColorBuff = _T("homestead");
  1184. int nLength = strColorBuff.GetLength();
  1185. if (nLength < cchMaxColorChars)
  1186. {
  1187. MBSTOWCS_S(pszColorBuff, strColorBuff, nLength + 1);
  1188. }
  1189. }
  1190. return S_OK;
  1191. }