Filter.cpp
上传用户:nbcables
上传日期:2007-01-11
资源大小:1243k
文件大小:3k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include <commctrl.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <malloc.h>
  6. #include "util.h"
  7. #include "Filter.h"
  8. #include "const.h"
  9. char g_dll_path[128];
  10. CMsgFilter::CMsgFilter()
  11. {
  12. m_pFilterInfo =NULL;
  13. m_nFilterInfoCount =0;
  14. FILE *fp;
  15. if(GetProfileString("HookAPI", "dll_path", "", g_dll_path, sizeof(g_dll_path)) ==0)
  16. return;
  17. char init_file[128];
  18. wsprintf(init_file, "%s\filtermsg.ini", g_dll_path);
  19. //WriteLog("FilterInit:init_file=%s", init_file);
  20. if((fp =fopen(init_file, "r")) ==NULL)
  21. {
  22. WriteLog("open init file %s failed!", init_file);
  23. return;
  24. }
  25. char buf[300], *p, caption[40], msg[30];
  26. while(!feof(fp) && fgets(buf, sizeof(buf), fp))
  27. {
  28. if(strlen(buf) <2 || buf[0] =='#') continue;
  29. if(buf[strlen(buf)-1] =='r' || buf[strlen(buf)-1] =='n')
  30. buf[strlen(buf)-1] =0;
  31. if(buf[strlen(buf)-2] =='r' || buf[strlen(buf)-2] =='n')
  32. buf[strlen(buf)-2] =0;
  33. p =strtok(buf, ",");
  34. if(!p) continue;
  35. if(strlen(p) >= sizeof(msg)) continue;
  36. strcpy(msg, p);
  37. caption[0] =0;
  38. p =strtok(NULL, ",");
  39. if(p)
  40. {
  41. if(strlen(p) >=sizeof(caption)) continue;
  42. strcpy(caption, p);
  43. strupr(caption);
  44. }
  45. if(m_pFilterInfo)
  46. m_pFilterInfo =(FILTER_INFO *)realloc(m_pFilterInfo, (m_nFilterInfoCount+1)*sizeof(FILTER_INFO));
  47. else
  48. m_pFilterInfo =(FILTER_INFO *)malloc((m_nFilterInfoCount+1)*sizeof(FILTER_INFO));
  49. memset(&m_pFilterInfo[m_nFilterInfoCount], 0, sizeof(FILTER_INFO));
  50. int id =0;
  51. if(msg[0] >='0' && msg[0] <='9')
  52. id =atoi(msg);
  53. else
  54. {
  55. for(int i=0; i<g_msg_count; i++)
  56. {
  57. if(!strcmpi(g_msg_info[i].name, msg))
  58. {
  59. id =g_msg_info[i].id;
  60. break;
  61. }
  62. }
  63. if(i ==g_msg_count)
  64. WriteLog("Can not found message %s", msg);
  65. }
  66. m_pFilterInfo[m_nFilterInfoCount].id =id;
  67. strcpy(m_pFilterInfo[m_nFilterInfoCount].win_caption, caption);
  68. //WriteLog("filter:%d,%d,%s.", m_nFilterInfoCount, id, caption);
  69. m_nFilterInfoCount++;
  70. }
  71. //WriteLog("filercount=%d", m_nFilterInfoCount);
  72. }
  73. CMsgFilter::~CMsgFilter()
  74. {
  75. if(m_pFilterInfo)
  76. free(m_pFilterInfo);
  77. }
  78. int CMsgFilter::Filter(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  79. {
  80. char txt[512];
  81. //if(msg >=(UINT)g_msg_count)
  82. // return false;
  83. txt[0] =0;
  84. GetWindowText(hWnd, txt, sizeof(txt));
  85. for(int i=0; i<m_nFilterInfoCount; i++)
  86. {
  87. //WriteLog("*************msg=%d, id=%d", msg, m_pFilterInfo[i].id);
  88. if(m_pFilterInfo[i].win_caption[0] && strcmpi(m_pFilterInfo[i].win_caption, txt))
  89. continue;
  90. if(msg ==m_pFilterInfo[i].id)
  91. {
  92. /*TCITEMW *pitem =(TCITEMW *)lParam;
  93. char temp[100];
  94. WideCharToMultiByte( CP_ACP, 0, pitem->pszText, -1, temp, 128,NULL,NULL); 
  95. */
  96. WriteLog("===============Filter %d ok, wParam=0x%x, lParam=0x%x", msg, wParam, lParam);
  97. return true;
  98. }
  99. }
  100. return false;
  101. }
  102. CMsgFilter::FilterSendMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  103. {
  104. //WriteLog("SendMessage");
  105. return Filter(hWnd, msg, wParam, lParam);
  106. }
  107. CMsgFilter::FilterPostMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  108. {
  109. //WriteLog("PostMessage");
  110. return Filter(hWnd, msg, wParam, lParam);
  111. }
  112. CMsgFilter::FilterCallWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  113. {
  114. //WriteLog("CallWindowProc");
  115. return Filter(hWnd, msg, wParam, lParam);
  116. }
  117. CMsgFilter::FilterDispatchMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  118. {
  119. //WriteLog("DispatchMessage");
  120. return Filter(hWnd, msg, wParam, lParam);
  121. }