ClassXP.c
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:3k
源码类别:

CA认证

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. // 预处理
  3. #include "CXPBase.h"
  4. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  5. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  6. // 钩子句柄
  7. #ifdef CXP_MULTITHREAD
  8. __declspec(thread)
  9. #endif
  10. HHOOK g_hCXPHook = NULL;
  11. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  12. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  13. // 动态连接库主函数
  14. #ifdef CXP_DLLMODE
  15. //#pragma comment(linker, "/EXPORT:_ClassXP@8")
  16. #pragma comment(linker, "/EXPORT:ClassXP=_ClassXP@8")
  17. BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID pvReserved)
  18. {
  19. if (dwReason == DLL_PROCESS_ATTACH)
  20. {
  21. DisableThreadLibraryCalls(hModule);
  22. #ifdef CXP_DLLAUTO
  23. ClassXP(NULL, TRUE);
  24. #endif
  25. }
  26. #ifdef CXP_DLLAUTO
  27. else if (dwReason == DLL_PROCESS_DETACH)
  28. {
  29. ClassXP(NULL, FALSE);
  30. }
  31. #endif
  32. return TRUE;
  33. }
  34. #endif
  35. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  36. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  37. // 设置或取消 ClassXP
  38. BOOL WINAPI ClassXP(HWND hWnd, BOOL bClassXP)
  39. {
  40. #ifdef CXP_DETECTTHEME
  41. // 检测主题
  42. if (bClassXP)
  43. {
  44. FARPROC pIsAppThemed = GetProcAddress(GetModuleHandle(TEXT("UXTHEME")), "IsAppThemed");
  45. if (pIsAppThemed && pIsAppThemed())
  46. {
  47. return FALSE;
  48. }
  49. }
  50. #endif
  51. // 是否指定了窗口
  52. _ReturnValIf(hWnd, CXPSet(hWnd, bClassXP));
  53. // 如果是设置 ClassXP,并且没有安装钩子
  54. if (bClassXP && (g_hCXPHook == NULL))
  55. {
  56. // 枚举当前线程中已存在的窗口,并设置为 ClassXP
  57. EnumThreadWindows(GetCurrentThreadId(), CXPEnumProc, TRUE);
  58. // 安装钩子,设置新创建的窗口为 ClassXP
  59. g_hCXPHook = SetWindowsHookEx(WH_CALLWNDPROC, CXPHookProc, 0, GetCurrentThreadId());
  60. return (g_hCXPHook != NULL);
  61. }
  62. // 如果是取消 ClassXP,并且已经安装过钩子
  63. else if ((bClassXP == FALSE) && g_hCXPHook)
  64. {
  65. // 枚举当前线程的窗口,并取消 ClassXP
  66. EnumThreadWindows(GetCurrentThreadId(), CXPEnumProc, FALSE);
  67. // 取消窗口钩子
  68. UnhookWindowsHookEx(g_hCXPHook);
  69. g_hCXPHook = NULL;
  70. return TRUE;
  71. }
  72. return FALSE;
  73. }
  74. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////