dllmain.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include "Stdafx.h"
  2. #include <AfxDllx.h>
  3. #include "SkinUI.h"
  4. //////////////////////////////////////////////////////////////////////////////////
  5. //静态变量
  6. static ULONG_PTR g_lGdiPlusToken=0L;
  7. static AFX_EXTENSION_MODULE SkinUIDLL={NULL,NULL};
  8. // 申明钩子
  9. DETOUR_TRAMPOLINE(int WINAPI SetScrollInfoT(HWND, int, LPCSCROLLINFO, BOOL), SetScrollInfo)
  10. DETOUR_TRAMPOLINE(BOOL WINAPI GetScrollInfoT(HWND, int, LPSCROLLINFO), GetScrollInfo)
  11. DETOUR_TRAMPOLINE(int WINAPI SetScrollPosT(HWND, int, int, BOOL), SetScrollPos)
  12. DETOUR_TRAMPOLINE(int WINAPI GetScrollPosT(HWND, int), GetScrollPos)
  13. DETOUR_TRAMPOLINE(BOOL WINAPI GetScrollRangeT(HWND, int, LPINT, LPINT), GetScrollRange)
  14. DETOUR_TRAMPOLINE(BOOL WINAPI SetScrollRangeT(HWND, int, int, int, BOOL), SetScrollRange)
  15. DETOUR_TRAMPOLINE(BOOL WINAPI ShowScrollBarT(HWND, int, BOOL), ShowScrollBar)
  16. DETOUR_TRAMPOLINE(BOOL WINAPI EnableScrollBarT(HWND, UINT, UINT), EnableScrollBar)
  17. int WINAPI SetScrollInfoD(HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, BOOL bRedraw)
  18. {
  19. if( SkinUI_IsValid(hwnd) )
  20. return SkinUI_SetScrollInfo(hwnd, fnBar, lpsi, bRedraw);
  21. else
  22. return SetScrollInfoT(hwnd, fnBar, lpsi, bRedraw);
  23. }
  24. BOOL WINAPI GetScrollInfoD(HWND hwnd, int fnBar, LPSCROLLINFO lpsi)
  25. {
  26. if( SkinUI_IsValid(hwnd) )
  27. return SkinUI_GetScrollInfo(hwnd, fnBar, lpsi);
  28. else
  29. return GetScrollInfoT(hwnd, fnBar, lpsi);
  30. }
  31. int WINAPI SetScrollPosD(HWND hwnd, int nBar, int nPos, BOOL bRedraw)
  32. {
  33. if( SkinUI_IsValid(hwnd) )
  34. return SkinUI_SetScrollPos(hwnd, nBar, nPos, bRedraw);
  35. else
  36. return SetScrollPosT(hwnd, nBar, nPos, bRedraw);
  37. }
  38. int WINAPI GetScrollPosD(HWND hwnd, int nBar)
  39. {
  40. if( SkinUI_IsValid(hwnd) )
  41. return SkinUI_GetScrollPos(hwnd, nBar);
  42. else
  43. return GetScrollPosT(hwnd, nBar);
  44. }
  45. BOOL WINAPI SetScrollRangeD(HWND hwnd, int nBar, int nMinPos, int nMaxPos, BOOL bRedraw)
  46. {
  47. if( SkinUI_IsValid(hwnd) )
  48. return SkinUI_SetScrollRange(hwnd, nBar, nMinPos, nMaxPos, bRedraw);
  49. else
  50. return SetScrollRangeT(hwnd, nBar, nMinPos, nMaxPos, bRedraw);
  51. }
  52. BOOL WINAPI GetScrollRangeD(HWND hwnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos)
  53. {
  54. if( SkinUI_IsValid(hwnd) )
  55. return SkinUI_GetScrollRange(hwnd, nBar, lpMinPos, lpMaxPos);
  56. else
  57. return GetScrollRangeT(hwnd, nBar, lpMinPos, lpMaxPos);
  58. }
  59. BOOL WINAPI ShowScrollBarD(HWND hwnd, int nBar, BOOL bShow)
  60. {
  61. if( SkinUI_IsValid(hwnd) )
  62. return SkinUI_ShowScrollBar(hwnd, nBar, bShow);
  63. else
  64. return ShowScrollBarT(hwnd, nBar, bShow);
  65. }
  66. BOOL WINAPI EnableScrollBarD(HWND hwnd, UINT wSBflags, UINT wArrows)
  67. {
  68. if( SkinUI_IsValid(hwnd) )
  69. return SkinUI_EnableScrollBar(hwnd, wSBflags, wArrows);
  70. else
  71. return EnableScrollBarT(hwnd, wSBflags, wArrows);
  72. }
  73. extern "C" int APIENTRY
  74. DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  75. {
  76. // 如果使用 lpReserved,请将此移除
  77. UNREFERENCED_PARAMETER(lpReserved);
  78. if (dwReason == DLL_PROCESS_ATTACH)
  79. {
  80. // 扩展 DLL 一次性初始化
  81. if (!AfxInitExtensionModule(SkinUIDLL, hInstance))return 0;
  82. new CDynLinkLibrary(SkinUIDLL);
  83. GdiplusStartupInput StartupInput;
  84. GdiplusStartup(&g_lGdiPlusToken,&StartupInput,NULL);
  85. //加载钩子
  86. DetourFunctionWithTrampoline((PBYTE)SetScrollInfoT, (PBYTE)SetScrollInfoD);
  87. DetourFunctionWithTrampoline((PBYTE)GetScrollInfoT, (PBYTE)GetScrollInfoD);
  88. DetourFunctionWithTrampoline((PBYTE)SetScrollPosT, (PBYTE)SetScrollPosD);
  89. DetourFunctionWithTrampoline((PBYTE)GetScrollPosT, (PBYTE)GetScrollPosD);
  90. DetourFunctionWithTrampoline((PBYTE)SetScrollRangeT, (PBYTE)SetScrollRangeD);
  91. DetourFunctionWithTrampoline((PBYTE)GetScrollRangeT, (PBYTE)GetScrollRangeD);
  92. DetourFunctionWithTrampoline((PBYTE)ShowScrollBarT, (PBYTE)ShowScrollBarD);
  93. DetourFunctionWithTrampoline((PBYTE)EnableScrollBarT, (PBYTE)EnableScrollBarD);
  94. }
  95. else if (dwReason == DLL_PROCESS_DETACH)
  96. {
  97. // 在调用析构函数之前终止该库
  98. AfxTermExtensionModule(SkinUIDLL);
  99. GdiplusShutdown(g_lGdiPlusToken);
  100. //卸载钩子
  101. DetourRemove((PBYTE)SetScrollInfoT, (PBYTE)SetScrollInfoD);
  102. DetourRemove((PBYTE)SetScrollPosT, (PBYTE)SetScrollPosD);
  103. DetourRemove((PBYTE)GetScrollInfoT, (PBYTE)GetScrollInfoD);
  104. DetourRemove((PBYTE)GetScrollPosT, (PBYTE)GetScrollPosD);
  105. DetourRemove((PBYTE)SetScrollRangeT, (PBYTE)SetScrollRangeD);
  106. DetourRemove((PBYTE)GetScrollRangeT, (PBYTE)GetScrollRangeD);
  107. DetourRemove((PBYTE)ShowScrollBarT, (PBYTE)ShowScrollBarD);
  108. DetourRemove((PBYTE)EnableScrollBarT, (PBYTE)EnableScrollBarD);
  109. }
  110. return 1; // 确定
  111. }