coolsb_detours.c
上传用户:xhri001
上传日期:2022-07-04
资源大小:99k
文件大小:5k
源码类别:

界面编程

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include "coolsb_detours.h"
  3. #include "..coolsbcoolscroll.h"
  4. #include "detours.h"
  5. #pragma warning(disable:4100)   // Trampolines don't use formal parameters.
  6. DETOUR_TRAMPOLINE(BOOL WINAPI Detour_EnableScrollBar(HWND hwnd, int wSBflags, UINT wArrows), EnableScrollBar);
  7. DETOUR_TRAMPOLINE(BOOL WINAPI Detour_GetScrollInfo (HWND hwnd, int fnBar, LPSCROLLINFO lpsi), GetScrollInfo);
  8. DETOUR_TRAMPOLINE(int  WINAPI Detour_GetScrollPos (HWND hwnd, int nBar), GetScrollPos);
  9. DETOUR_TRAMPOLINE(BOOL WINAPI Detour_GetScrollRange (HWND hwnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos), GetScrollRange);
  10. DETOUR_TRAMPOLINE(int  WINAPI Detour_SetScrollInfo (HWND hwnd, int fnBar, LPSCROLLINFO lpsi, BOOL fRedraw), SetScrollInfo);
  11. DETOUR_TRAMPOLINE(int  WINAPI Detour_SetScrollPos (HWND hwnd, int nBar, int nPos, BOOL fRedraw), SetScrollPos);
  12. DETOUR_TRAMPOLINE(int  WINAPI Detour_SetScrollRange (HWND hwnd, int nBar, int nMinPos, int nMaxPos, BOOL fRedraw), SetScrollRange);
  13. DETOUR_TRAMPOLINE(BOOL WINAPI Detour_ShowScrollBar (HWND hwnd, int wBar, BOOL fShow), ShowScrollBar);
  14. static BOOL WINAPI Tramp_EnableScrollBar(HWND hwnd, int wSBflags, UINT wArrows)
  15. {
  16. if(CoolSB_IsCoolScrollEnabled(hwnd))
  17. return CoolSB_EnableScrollBar(hwnd, wSBflags, wArrows);
  18. else
  19. return Detour_EnableScrollBar(hwnd, wSBflags, wArrows);
  20. }
  21. static BOOL WINAPI Tramp_GetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi)
  22. {
  23. if(CoolSB_IsCoolScrollEnabled(hwnd))
  24. return CoolSB_GetScrollInfo(hwnd, fnBar, lpsi);
  25. else
  26. return Detour_GetScrollInfo(hwnd, fnBar, lpsi);
  27. }
  28. static int  WINAPI Tramp_GetScrollPos(HWND hwnd, int nBar)
  29. {
  30. if(CoolSB_IsCoolScrollEnabled(hwnd))
  31. return CoolSB_GetScrollPos(hwnd, nBar);
  32. else
  33. return Detour_GetScrollPos(hwnd, nBar);
  34. }
  35. static BOOL WINAPI Tramp_GetScrollRange(HWND hwnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos)
  36. {
  37. if(CoolSB_IsCoolScrollEnabled(hwnd))
  38. return CoolSB_GetScrollRange(hwnd, nBar, lpMinPos, lpMaxPos);
  39. else
  40. return Detour_GetScrollRange(hwnd, nBar, lpMinPos, lpMaxPos);
  41. }
  42. static int  WINAPI Tramp_SetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi, BOOL fRedraw)
  43. {
  44. if(CoolSB_IsCoolScrollEnabled(hwnd))
  45. return CoolSB_SetScrollInfo(hwnd, fnBar, lpsi, fRedraw);
  46. else
  47. return Detour_SetScrollInfo(hwnd, fnBar, lpsi, fRedraw);
  48. }
  49. static int  WINAPI Tramp_SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL fRedraw)
  50. {
  51. if(CoolSB_IsCoolScrollEnabled(hwnd))
  52. return CoolSB_SetScrollPos(hwnd, nBar, nPos, fRedraw);
  53. else
  54. return Detour_SetScrollPos(hwnd, nBar, nPos, fRedraw);
  55. }
  56. static int  WINAPI Tramp_SetScrollRange(HWND hwnd, int nBar, int nMinPos, int nMaxPos, BOOL fRedraw)
  57. {
  58. if(CoolSB_IsCoolScrollEnabled(hwnd))
  59. return CoolSB_SetScrollRange(hwnd, nBar, nMinPos, nMaxPos, fRedraw);
  60. else
  61. return Detour_SetScrollRange(hwnd, nBar, nMinPos, nMaxPos, fRedraw);
  62. }
  63. static BOOL WINAPI Tramp_ShowScrollBar (HWND hwnd, int wBar, BOOL fShow)
  64. {
  65. if(CoolSB_IsCoolScrollEnabled(hwnd))
  66. return CoolSB_ShowScrollBar(hwnd, wBar, fShow);
  67. else
  68. return Detour_ShowScrollBar(hwnd, wBar, fShow);
  69. }
  70. BOOL WINAPI CoolSB_InitializeApp(void)
  71. {
  72. DWORD dwVersion = GetVersion();
  73. // Only available under Windows NT, 2000 and XP
  74. if(dwVersion < 0x80000000)
  75. {
  76. DetourFunctionWithTrampoline((PBYTE)Detour_EnableScrollBar, (PBYTE)Tramp_EnableScrollBar);
  77. DetourFunctionWithTrampoline((PBYTE)Detour_GetScrollInfo,   (PBYTE)Tramp_GetScrollInfo);
  78. DetourFunctionWithTrampoline((PBYTE)Detour_GetScrollPos,    (PBYTE)Tramp_GetScrollPos);
  79. DetourFunctionWithTrampoline((PBYTE)Detour_GetScrollRange,  (PBYTE)Tramp_GetScrollRange);
  80. DetourFunctionWithTrampoline((PBYTE)Detour_SetScrollInfo,   (PBYTE)Tramp_SetScrollInfo);
  81. DetourFunctionWithTrampoline((PBYTE)Detour_SetScrollPos,    (PBYTE)Tramp_SetScrollPos);
  82. DetourFunctionWithTrampoline((PBYTE)Detour_SetScrollRange,  (PBYTE)Tramp_SetScrollRange);
  83. DetourFunctionWithTrampoline((PBYTE)Detour_ShowScrollBar,   (PBYTE)Tramp_ShowScrollBar);
  84. // don't actually use this feature within coolsb yet, but we might need it
  85. CoolSB_SetESBProc(Detour_EnableScrollBar);
  86. return TRUE;
  87. }
  88. else
  89. {
  90. return FALSE;
  91. }
  92. }
  93. BOOL WINAPI CoolSB_UninitializeApp(void)
  94. {
  95. DWORD dwVersion = GetVersion();
  96. // Only available under Windows NT, 2000 and XP
  97. if(dwVersion < 0x80000000)
  98. {
  99. DetourRemove((PBYTE)Detour_EnableScrollBar, (PBYTE)Tramp_EnableScrollBar);
  100. DetourRemove((PBYTE)Detour_GetScrollInfo,   (PBYTE)Tramp_GetScrollInfo);
  101. DetourRemove((PBYTE)Detour_GetScrollPos,    (PBYTE)Tramp_GetScrollPos);
  102. DetourRemove((PBYTE)Detour_GetScrollRange,  (PBYTE)Tramp_GetScrollRange);
  103. DetourRemove((PBYTE)Detour_SetScrollInfo,   (PBYTE)Tramp_SetScrollInfo);
  104. DetourRemove((PBYTE)Detour_SetScrollPos,    (PBYTE)Tramp_SetScrollPos);
  105. DetourRemove((PBYTE)Detour_SetScrollRange,  (PBYTE)Tramp_SetScrollRange);
  106. DetourRemove((PBYTE)Detour_ShowScrollBar,   (PBYTE)Tramp_ShowScrollBar);
  107. // don't actually use this feature within coolsb yet, but we might need it
  108. CoolSB_SetESBProc(EnableScrollBar);
  109. return TRUE;
  110. }
  111. else
  112. {
  113. return FALSE;
  114. }
  115. }