hxwdllwx.cpp
上传用户:qiandli
上传日期:2021-02-22
资源大小:103k
文件大小:6k
源码类别:

输入法编程

开发平台:

Visual Basic

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #pragma comment(lib,"imm32.lib")
  5. #pragma data_seg("mysechx")
  6. HHOOK g_hKeyboard=NULL;
  7. HWND g_hMainhWnd=NULL;
  8. char g_IMEString[256]="";
  9. bool g_HOOKflag=false;
  10. #pragma data_seg()
  11. class clsHookInfo
  12. {
  13. private:
  14. BYTE mbytOldCode[5];
  15. BYTE mbytNewCode[5];
  16. int mlngFunAddr;
  17. bool hookBeOK;
  18. public:
  19. bool HookApi(LPCTSTR strDllName,LPCTSTR strFunName,int lngFunAddr)
  20. {
  21. hookBeOK=false;
  22. HMODULE hModule=NULL;
  23. int dwJmpAddr=0;
  24. hModule=GetModuleHandle(strDllName);
  25. if (hModule==NULL) {return false;}
  26. mlngFunAddr=(int)GetProcAddress(hModule,strFunName);
  27. if (mlngFunAddr==NULL) {return false;}
  28. CopyMemory(mbytOldCode,(const void *)mlngFunAddr,5);
  29. mbytNewCode[0]=0xE9;
  30. dwJmpAddr=lngFunAddr-mlngFunAddr-5;
  31. CopyMemory(&mbytNewCode[1],&dwJmpAddr,4);
  32. hookBeOK=true;
  33. HookStatus(true);
  34. return true;
  35. }
  36. bool HookStatus(bool blnIsHook)
  37. {
  38. DWORD oldACC,newACC;
  39. if (!hookBeOK) {return false;}
  40. if (blnIsHook)
  41. {
  42. VirtualProtect((LPVOID)mlngFunAddr,5,PAGE_WRITECOPY,&oldACC);
  43. CopyMemory((void *)mlngFunAddr,mbytNewCode,5);
  44. VirtualProtect((LPVOID)mlngFunAddr,5,oldACC,&newACC);
  45. }
  46. else
  47. {
  48. VirtualProtect((LPVOID)mlngFunAddr,5,PAGE_WRITECOPY,&oldACC);
  49. CopyMemory((void *)mlngFunAddr,mbytOldCode,5);
  50. VirtualProtect((LPVOID)mlngFunAddr,5,oldACC,&newACC);
  51. }
  52. return true;
  53. }
  54. };
  55. clsHookInfo g_myHOOK1;
  56. clsHookInfo g_myHOOK2;
  57. char g_StringBuf1[256]="";
  58. char g_StringBuf2[256]="";
  59. UINT WM_HXWDLLWX_QQBTX=NULL;
  60. BOOL MByteToWChar(LPCSTR lpcszStr,LPWSTR lpwszStr,DWORD dwSize)
  61. {
  62.     DWORD dwMinSize;
  63.     dwMinSize = MultiByteToWideChar(CP_ACP, 0, lpcszStr, -1, NULL, 0);
  64.     if(dwSize < dwMinSize)
  65.     {
  66.      return FALSE;
  67.     }
  68.     MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize); 
  69.     return TRUE;
  70. }
  71. BOOL WCharToMByte(LPCWSTR lpcwszStr,LPSTR lpszStr,DWORD dwSize)
  72. {
  73.    DWORD dwMinSize;
  74.    dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
  75.    if(dwSize < dwMinSize)
  76.    {
  77.     return FALSE;
  78.    }
  79.    WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);
  80.    return TRUE;
  81. }
  82. LONG WINAPI myImmGetCompositionStringA(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
  83. {
  84. LONG myReturn=0;
  85. LONG tempLen=0;
  86. int StrBufLen=0;
  87. if (dwIndex==GCS_RESULTSTR && g_HOOKflag)
  88. {
  89. memset(g_IMEString,0,256);
  90. tempLen=255;
  91. g_myHOOK1.HookStatus(false);
  92. ImmGetCompositionStringA(hIMC,GCS_RESULTSTR,g_IMEString,tempLen);
  93. g_myHOOK1.HookStatus(true);
  94. g_IMEString[tempLen]=0;
  95. if (lstrcmp(g_IMEString,g_StringBuf1)!=0)
  96. {
  97. memset(g_StringBuf1,0,256);
  98. lstrcpy(g_StringBuf1,g_IMEString);
  99. SendMessage(g_hMainhWnd,WM_HXWDLLWX_QQBTX,0,0);
  100. memset(g_StringBuf2,0,256);
  101. lstrcpy(g_StringBuf2,g_IMEString);
  102. }
  103. if (lpBuf==NULL || dwBufLen==0)
  104. {
  105. myReturn=lstrlen(g_StringBuf2);
  106. }
  107. else
  108. {
  109. StrBufLen=lstrlen(g_StringBuf2);
  110. memset(lpBuf,0,dwBufLen);
  111. if (dwBufLen>=StrBufLen) 
  112. {
  113. dwBufLen=StrBufLen;
  114. myReturn=StrBufLen;
  115. }
  116. else
  117. {
  118. myReturn=0;
  119. }
  120. memcpy(lpBuf,g_StringBuf2,dwBufLen);
  121. }
  122. }
  123. else
  124. {
  125. g_myHOOK1.HookStatus(false);
  126. myReturn=ImmGetCompositionStringA(hIMC,dwIndex,lpBuf,dwBufLen);
  127. g_myHOOK1.HookStatus(true);
  128. }
  129. return myReturn;
  130. }
  131. LONG WINAPI myImmGetCompositionStringW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
  132. {
  133. LONG myReturn=0;
  134. LONG tempLen=0;
  135. int StrBufLen=0;
  136. if (dwIndex==GCS_RESULTSTR && g_HOOKflag)
  137. {
  138. memset(g_IMEString,0,256);
  139. tempLen=254;
  140. g_myHOOK2.HookStatus(false);
  141. ImmGetCompositionStringW(hIMC,GCS_RESULTSTR,g_IMEString,tempLen);
  142. g_myHOOK2.HookStatus(true);
  143. g_IMEString[254]=0;
  144. g_IMEString[255]=0;
  145. if (lstrcmpW((wchar_t *)g_IMEString,(wchar_t *)g_StringBuf1)!=0)
  146. {
  147. memset(g_StringBuf1,0,256);
  148. lstrcpyW((wchar_t *)g_StringBuf1,(wchar_t *)g_IMEString);
  149. WCharToMByte((wchar_t *)g_StringBuf1,g_IMEString,256);
  150. SendMessage(g_hMainhWnd,WM_HXWDLLWX_QQBTX,0,0);
  151. memset(g_StringBuf2,0,256);
  152. MByteToWChar(g_IMEString,(wchar_t *)g_StringBuf2,128);
  153. }
  154. if (lpBuf==NULL || dwBufLen==0)
  155. {
  156. myReturn=lstrlenW((wchar_t *)g_StringBuf2)*2;
  157. }
  158. else
  159. {
  160. StrBufLen=lstrlenW((wchar_t *)g_StringBuf2)*2;
  161. memset(lpBuf,0,dwBufLen);
  162. if (dwBufLen>=StrBufLen) 
  163. {
  164. dwBufLen=StrBufLen;
  165. myReturn=StrBufLen;
  166. }
  167. else
  168. {
  169. myReturn=0;
  170. }
  171. memcpy(lpBuf,g_StringBuf2,dwBufLen);
  172. }
  173. }
  174. else
  175. {
  176. g_myHOOK2.HookStatus(false);
  177. myReturn=ImmGetCompositionStringW(hIMC,dwIndex,lpBuf,dwBufLen);
  178. g_myHOOK2.HookStatus(true);
  179. }
  180. return myReturn;
  181. }
  182. BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
  183. {
  184.    switch(fdwReason)
  185.     {
  186.       case DLL_PROCESS_ATTACH:
  187.   WM_HXWDLLWX_QQBTX=RegisterWindowMessage("WM_HXWDLLWX_QQBTX");
  188.   g_myHOOK1.HookApi("imm32.dll","ImmGetCompositionStringA",(int)myImmGetCompositionStringA);
  189.   g_myHOOK2.HookApi("imm32.dll","ImmGetCompositionStringW",(int)myImmGetCompositionStringW);
  190.         break;
  191.   case DLL_THREAD_ATTACH:
  192.  break;
  193.   case DLL_THREAD_DETACH:
  194.  break;
  195.       case DLL_PROCESS_DETACH:
  196.   g_myHOOK1.HookStatus(false);
  197.   g_myHOOK2.HookStatus(false);
  198.         break;
  199.       default:
  200.         break;
  201.     }
  202. return true;
  203. }
  204. BOOL CALLBACK DLLstopHOOK(DWORD state,PVOID arg2)
  205. {
  206. return TRUE;
  207. }
  208. int WINAPI DLLstartHOOK(HWND myhWnd)
  209. {
  210. g_hMainhWnd=myhWnd;
  211. return 1;
  212. }
  213. int WINAPI DLLsetHOOKState(bool myState)
  214. {
  215. if (myState)
  216. {
  217. g_HOOKflag=true;
  218. }
  219. else
  220. {
  221. g_HOOKflag=false;
  222. }
  223. return 1;
  224. }
  225. LPCTSTR WINAPI DLLGetPubString()
  226. {
  227. char tmpStr[258]="";
  228. lstrcpy(tmpStr,g_IMEString);
  229. tmpStr[256]=0;
  230. tmpStr[257]=0;
  231. return (LPCTSTR)SysAllocString((const OLECHAR *)tmpStr);
  232. }
  233. int WINAPI DLLSetPubString(LPCTSTR tmpStr)
  234. {
  235. memset(g_IMEString,0,256);
  236. if (lstrlen(tmpStr)>255)
  237. {
  238. lstrcpyn(g_IMEString,tmpStr,256);
  239. }
  240. else
  241. {
  242. lstrcpy(g_IMEString,tmpStr);
  243. }
  244. return 1;
  245. }
  246. DWORD CALLBACK RunDllHostCallBack(DWORD calldata1, DWORD calldata2,DWORD calldata3)
  247. {
  248. // 输入法DLL注入服务的回调函数
  249. return 0;
  250. }