hxwdllwx.cpp
上传用户:ollolxp
上传日期:2021-02-23
资源大小:52k
文件大小:7k
源码类别:

输入法编程

开发平台:

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. UINT WM_HXWDLLWX_HOOKKEY=NULL;
  61. BOOL MByteToWChar(LPCSTR lpcszStr,LPWSTR lpwszStr,DWORD dwSize)
  62. {
  63.     DWORD dwMinSize;
  64.     dwMinSize = MultiByteToWideChar(CP_ACP, 0, lpcszStr, -1, NULL, 0);
  65.     if(dwSize < dwMinSize)
  66.     {
  67.      return FALSE;
  68.     }
  69.     MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize); 
  70.     return TRUE;
  71. }
  72. BOOL WCharToMByte(LPCWSTR lpcwszStr,LPSTR lpszStr,DWORD dwSize)
  73. {
  74.    DWORD dwMinSize;
  75.    dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
  76.    if(dwSize < dwMinSize)
  77.    {
  78.     return FALSE;
  79.    }
  80.    WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);
  81.    return TRUE;
  82. }
  83. LONG WINAPI myImmGetCompositionStringA(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
  84. {
  85. LONG myReturn=0;
  86. LONG tempLen=0;
  87. int StrBufLen=0;
  88. if (dwIndex==GCS_RESULTSTR && g_HOOKflag)
  89. {
  90. memset(g_IMEString,0,256);
  91. tempLen=255;
  92. g_myHOOK1.HookStatus(false);
  93. ImmGetCompositionStringA(hIMC,GCS_RESULTSTR,g_IMEString,tempLen);
  94. g_myHOOK1.HookStatus(true);
  95. g_IMEString[tempLen]=0;
  96. if (lstrcmp(g_IMEString,g_StringBuf1)!=0)
  97. {
  98. memset(g_StringBuf1,0,256);
  99. lstrcpy(g_StringBuf1,g_IMEString);
  100. SendMessage(g_hMainhWnd,WM_HXWDLLWX_QQBTX,0,0);
  101. memset(g_StringBuf2,0,256);
  102. lstrcpy(g_StringBuf2,g_IMEString);
  103. }
  104. if (lpBuf==NULL || dwBufLen==0)
  105. {
  106. myReturn=lstrlen(g_StringBuf2);
  107. }
  108. else
  109. {
  110. StrBufLen=lstrlen(g_StringBuf2);
  111. memset(lpBuf,0,dwBufLen);
  112. if (dwBufLen>=StrBufLen) 
  113. {
  114. dwBufLen=StrBufLen;
  115. myReturn=StrBufLen;
  116. }
  117. else
  118. {
  119. myReturn=0;
  120. }
  121. memcpy(lpBuf,g_StringBuf2,dwBufLen);
  122. }
  123. }
  124. else
  125. {
  126. g_myHOOK1.HookStatus(false);
  127. myReturn=ImmGetCompositionStringA(hIMC,dwIndex,lpBuf,dwBufLen);
  128. g_myHOOK1.HookStatus(true);
  129. }
  130. return myReturn;
  131. }
  132. LONG WINAPI myImmGetCompositionStringW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
  133. {
  134. LONG myReturn=0;
  135. LONG tempLen=0;
  136. int StrBufLen=0;
  137. if (dwIndex==GCS_RESULTSTR && g_HOOKflag)
  138. {
  139. memset(g_IMEString,0,256);
  140. tempLen=254;
  141. g_myHOOK2.HookStatus(false);
  142. ImmGetCompositionStringW(hIMC,GCS_RESULTSTR,g_IMEString,tempLen);
  143. g_myHOOK2.HookStatus(true);
  144. g_IMEString[254]=0;
  145. g_IMEString[255]=0;
  146. if (lstrcmpW((wchar_t *)g_IMEString,(wchar_t *)g_StringBuf1)!=0)
  147. {
  148. memset(g_StringBuf1,0,256);
  149. lstrcpyW((wchar_t *)g_StringBuf1,(wchar_t *)g_IMEString);
  150. WCharToMByte((wchar_t *)g_StringBuf1,g_IMEString,256);
  151. SendMessage(g_hMainhWnd,WM_HXWDLLWX_QQBTX,0,0);
  152. memset(g_StringBuf2,0,256);
  153. MByteToWChar(g_IMEString,(wchar_t *)g_StringBuf2,128);
  154. }
  155. if (lpBuf==NULL || dwBufLen==0)
  156. {
  157. myReturn=lstrlenW((wchar_t *)g_StringBuf2)*2;
  158. }
  159. else
  160. {
  161. StrBufLen=lstrlenW((wchar_t *)g_StringBuf2)*2;
  162. memset(lpBuf,0,dwBufLen);
  163. if (dwBufLen>=StrBufLen) 
  164. {
  165. dwBufLen=StrBufLen;
  166. myReturn=StrBufLen;
  167. }
  168. else
  169. {
  170. myReturn=0;
  171. }
  172. memcpy(lpBuf,g_StringBuf2,dwBufLen);
  173. }
  174. }
  175. else
  176. {
  177. g_myHOOK2.HookStatus(false);
  178. myReturn=ImmGetCompositionStringW(hIMC,dwIndex,lpBuf,dwBufLen);
  179. g_myHOOK2.HookStatus(true);
  180. }
  181. return myReturn;
  182. }
  183. BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
  184. {
  185.    switch(fdwReason)
  186.     {
  187.       case DLL_PROCESS_ATTACH:
  188.   WM_HXWDLLWX_QQBTX=RegisterWindowMessage("WM_HXWDLLWX_QQBTX");
  189.   WM_HXWDLLWX_HOOKKEY=RegisterWindowMessage("WM_HXWDLLWX_HOOKKEY");
  190.   g_myHOOK1.HookApi("imm32.dll","ImmGetCompositionStringA",(int)myImmGetCompositionStringA);
  191.   g_myHOOK2.HookApi("imm32.dll","ImmGetCompositionStringW",(int)myImmGetCompositionStringW);
  192.         break;
  193.   case DLL_THREAD_ATTACH:
  194.  break;
  195.   case DLL_THREAD_DETACH:
  196.  break;
  197.       case DLL_PROCESS_DETACH:
  198.   g_myHOOK1.HookStatus(false);
  199.   g_myHOOK2.HookStatus(false);
  200.         break;
  201.       default:
  202.         break;
  203.     }
  204. return true;
  205. }
  206. LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
  207. {
  208. if (code==0 && g_HOOKflag)
  209. {
  210. SendMessage(g_hMainhWnd,WM_HXWDLLWX_HOOKKEY,wParam,lParam);
  211. }
  212. return CallNextHookEx(g_hKeyboard,code,wParam,lParam);
  213. }
  214. void setHOOK()
  215. {
  216. g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("hxwdllwx.dll"),0);
  217. }
  218. int WINAPI DLLstartHOOK(HWND myhWnd)
  219. {
  220. if (g_hMainhWnd==NULL)
  221. {
  222. g_hMainhWnd=myhWnd;
  223. }
  224. return 1;
  225. }
  226. int WINAPI DLLstopHOOK()
  227. {
  228. if (g_hKeyboard!=NULL)
  229. {
  230. UnhookWindowsHookEx(g_hKeyboard);
  231. g_hKeyboard=NULL;
  232. }
  233. return 1;
  234. }
  235. int WINAPI DLLsetHOOKState(bool myState)
  236. {
  237. if (myState)
  238. {
  239. if (g_hKeyboard==NULL)
  240. {
  241. setHOOK();
  242. }
  243. g_HOOKflag=true;
  244. }
  245. else
  246. {
  247. g_HOOKflag=false;
  248. }
  249. return 1;
  250. }
  251. LPCTSTR WINAPI DLLGetPubString()
  252. {
  253. char tmpStr[258]="";
  254. lstrcpy(tmpStr,g_IMEString);
  255. tmpStr[256]=0;
  256. tmpStr[257]=0;
  257. return (LPCTSTR)SysAllocString((const OLECHAR *)tmpStr);
  258. }
  259. int WINAPI DLLSetPubString(LPCTSTR tmpStr)
  260. {
  261. memset(g_IMEString,0,256);
  262. if (lstrlen(tmpStr)>255)
  263. {
  264. lstrcpyn(g_IMEString,tmpStr,256);
  265. }
  266. else
  267. {
  268. lstrcpy(g_IMEString,tmpStr);
  269. }
  270. return 1;
  271. }