DLL.CPP
上传用户:hyb6888
上传日期:2016-01-24
资源大小:5186k
文件大小:8k
源码类别:

输入法编程

开发平台:

Visual C++

  1. // dll.cpp : Defines the entry point for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. #include "windows.h"
  5. #include "string.h"
  6. #include "stdio.h"
  7. #include "EntoCh.h"
  8. EntoCh  CHchang;
  9. HWND ATC=0;
  10. #define MYLIBAPI extern "C" __declspec(dllexport)
  11. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  12. int WriteReg(char *valname,char *keyVal);
  13. DWORD mmReadReg(char *valname);
  14. DWORD ReadReg();
  15. MYLIBAPI BOOL  keyprogress(int wparam,char *retInputBuf,char *SendCh,char *SendENbuf,char *Midtems,char*Control );
  16. BOOL WINAPI DllMain (
  17.  HINSTANCE    hInstDLL,
  18.  DWORD        dwFunction,
  19.  LPVOID       lpNot)
  20. {
  21.      switch(dwFunction)
  22.     {
  23. case DLL_PROCESS_ATTACH:
  24. CHchang.Start();
  25. break;
  26.     case DLL_PROCESS_DETACH:
  27. break;
  28.     case DLL_THREAD_DETACH:
  29. break;
  30. }
  31.     return TRUE;
  32. }
  33. MYLIBAPI BOOL myImeProcessKey(long *fcmywnd,char *SendCH,char *Control,HIMC hIMC,UINT vKey,LPARAM lKeyData,CONST LPBYTE lpbKeyState)
  34. {  
  35. int mykey;
  36.     BOOL fRet = FALSE;
  37. unsigned char kbByte[256];
  38. char ss1[1000]="",ss2[1000]="",ss3[1000];
  39. try
  40. {
  41.     mykey=(int)vKey;
  42. GetKeyboardState(kbByte);
  43. //GetAsyncKeyState上一次调用以来,如键已被按过,则位0设为1;
  44.     //否则设为0。如键目前处于按下状态,则位8设为1;如抬起,则为0。
  45. //按住Ctrl 、Shift(10)或Alt时不进行编 VK_ATTN VK_CONTROL
  46. if (lpbKeyState[VK_ATTN] & 0x80)
  47.         return FALSE;
  48.     //////////////////////////////////////////////
  49. if(kbByte[VK_CAPITAL]&1)//大写字母打开时将不进行输入处理
  50. return 0;
  51. //sprintf(ss,"%d",mykey);
  52.     ////////////////////////////////////////////////////
  53. //以下为转换功能
  54. ReadReg();                    //查看软件是否需要更新字库
  55. fRet=keyprogress(mykey,ss1, SendCH,ss2,ss3,Control);
  56. //MessageBox(0,ss1,ss3,0);
  57.   } catch (...) {
  58.        MessageBox(0,"myImeProcessKey","字库有错误发生",0);
  59.   }
  60.     return fRet;
  61. }
  62. ////////////////////////////////////////////////
  63. //   按键处理
  64. //
  65. MYLIBAPI BOOL ClearBuf()
  66. {
  67. CHchang.ClearBuf();
  68. return 0;
  69. }
  70. MYLIBAPI BOOL  insertNewWord( char *En,char *chi)
  71. {
  72. char ss[1500];
  73. int mode=1;
  74. //strcpy(En,"TKTK");
  75. //strcpy(chi,"和和");
  76. sprintf(ss,"%s  %s",En,chi);
  77. MessageBox(0,ss,"insertNewWord",0);
  78. //mode=1表示从基本到扩展,mode=2表示从扩展到基本,mode=3表示仅基本,mode=4表示仅扩展
  79.     //
  80. if(CHchang.myCHLib.mode==1||CHchang.myCHLib.mode==3)
  81.     mode=1;
  82. if(CHchang.myCHLib.mode==2||CHchang.myCHLib.mode==4)
  83.     mode=2;
  84. CHchang.myCHLib.ReadchNode.insertID(En,chi,mode);
  85. MessageBox(0,"End","insertNewWord",0);
  86. return 0;
  87. }
  88. MYLIBAPI BOOL  getnextpage( char *Midtems,int torword)
  89. {
  90. char *pp;
  91. try
  92. {
  93. pp=CHchang.NextPage(torword);
  94. if(pp!=0)
  95. strcpy(Midtems,pp);
  96. else
  97. Midtems[0]=0;
  98. // MessageBox(0,Midtems,0,0);
  99. // if( Midtems[0]!=0)
  100. // MessageBox (0,"getnextpage",Midtems,0);
  101.   } catch (...) {
  102.    MessageBox(0,"keyprogress","字库有错误发生",0);
  103.   }
  104. return 0;
  105. }
  106. MYLIBAPI BOOL  keyprogress(int wparam,char *retInputBuf,char *SendCh,char *SendENbuf,char *Midtems,char*Control )
  107. {
  108. BOOL lresult=0;
  109. char ss[100];
  110. try
  111. {
  112. if(CHchang.loadFlage==0)
  113. return 0;
  114.     //GetAsyncKeyState上一次调用以来,如键已被按过,则位0设为1;
  115.     //否则设为0。如键目前处于按下状态,则位15设为1;如抬起,则为0。
  116. //按住Ctrl或Alt时不进行编    VK_ATTN  VK_SHIFT 
  117.     //由于开始时需要更新GetAsyncKeyState的值,必须先调用一次。
  118.     sprintf(ss," %d %d %d ",GetAsyncKeyState(16),GetAsyncKeyState(17),GetAsyncKeyState(18));
  119. if( (GetAsyncKeyState(17)&8000)==0 && (GetAsyncKeyState(18)&8000)==0 )
  120. {
  121. //Control返回值用于控制光标移动
  122. lresult=CHchang.Translatechar(wparam,retInputBuf, SendCh,Control);    //翻译字符串
  123.    if(SendCh[0]!=0)
  124. {
  125.    char str[100];
  126.    sprintf(str,"%d",wparam);
  127.    //MessageBox(0,str,0,0);
  128.    }
  129. if(Midtems[0]!='-')//为-说明调用者不要求设置,可防止下标越界
  130. if(CHchang.GetCurPage()!=NULL)
  131. strcpy(Midtems,CHchang.GetCurPage());
  132. if(SendENbuf[0]!='-')
  133. strcpy(SendENbuf,CHchang.SendENbuf);
  134. }
  135. else
  136. lresult=0;
  137.   } catch (...) {
  138.        MessageBox(0,"keyprogress","字库有错误发生",0);
  139.   }
  140. return lresult;// 如果为0则向下传递信息,如果为1则不传递信息。
  141. }
  142. MYLIBAPI BOOL SetIMEModle (int Mode)
  143. {
  144.     CHchang.ClearBuf();
  145. CHchang.myCHLib.IMEWBSetMode(Mode);
  146. return 0;
  147. }
  148. //////////////////////////////////////////////
  149. //加载字库,以及设置其他变量
  150. ///////////////////////////////////////////
  151. MYLIBAPI BOOL DLLstart (int update)
  152. {
  153. // char ss[100];
  154. if(update==1)
  155. {
  156. //sprintf(ss,"%d",update);
  157. //MessageBox(0,"loadChiLib",ss,0);
  158. CHchang.myCHLib.ReadchNode.Unloadmylib();
  159. }
  160. CHchang.Start();
  161. return 0;
  162. }
  163. int RegReadString(char *valname, char *keyVal)
  164. {
  165. HKEY hKey;
  166. unsigned long lon;
  167. char dd[100]="";
  168. keyVal[0]=0;
  169. if ( RegCreateKey(HKEY_CURRENT_USER,"Software\jsime", &hKey) == ERROR_SUCCESS )
  170. {
  171. //如果没有键值就建立一个
  172. if( RegQueryValueEx( hKey,valname,NULL,NULL,(LPBYTE)keyVal,&lon) != ERROR_SUCCESS ){
  173.   //RegSetValueEx(hKey, valname,0,REG_SZ,(LPBYTE)dd,0);
  174. }
  175. RegCloseKey(hKey);
  176. }
  177. return 0;
  178. }
  179. ///////////////////////////////////////////////////
  180. int RegSaveString(char *pathname,char *valname, char *keyVal)
  181. {
  182. HKEY hKey;
  183. if ( RegCreateKey(HKEY_CURRENT_USER,pathname, &hKey) == ERROR_SUCCESS )
  184. {
  185.  //   MessageBox(0,valname,keyVal,0);
  186.   RegSetValueEx(hKey, valname,0,REG_SZ,(LPBYTE)keyVal,strlen(keyVal)+1);
  187. RegCloseKey(hKey);
  188. }
  189. return 0;
  190. }
  191. ///////////////////////////////////////////////////////////////////////
  192. //设置指定的输入法为第一输入法
  193. MYLIBAPI int  SetOrderIME(HKL instHKL)
  194. {
  195. char ss[1000],retss[100],temss[100],tempath[1000];
  196. int i,t=1,num;
  197. HKL hKB[100];
  198. HKL hCurKBDLayout;
  199. hCurKBDLayout = GetKeyboardLayout(0); //取得目前的输入法
  200.     sprintf(ss,"%x", instHKL);
  201. ActivateKeyboardLayout (instHKL, 0);
  202. SetKeyboardState((unsigned char *)&ss);
  203. LoadKeyboardLayout(ss, KLF_REORDER);
  204. ActivateKeyboardLayout ((HKL)804, 0);
  205. SetKeyboardState((unsigned char *)&"00000804");
  206. LoadKeyboardLayout("00000804", KLF_REORDER);
  207. num = GetKeyboardLayoutList(25, hKB) ;//取得所有输入法
  208. for(i=0;i<num;i++)
  209. {
  210. sprintf(retss,"%x",hKB[i]);
  211. if(ImmIsIME(hKB[i])==0||strlen(retss)<8)
  212. {
  213. sprintf(retss,"%x",(unsigned short int)hKB[i]);
  214. sprintf(temss,"00000000");
  215. sprintf(&temss[8-strlen(retss)],retss);
  216. sprintf(ss,"%d",t);
  217. RegSaveString("Keyboard Layout\Preload",ss, temss);
  218. sprintf(tempath,"Keyboard Layout\Preload\%d",t);
  219. RegSaveString(tempath,"", temss);
  220. if(t==1)
  221. {
  222. SetKeyboardState((unsigned char *)&temss);
  223. LoadKeyboardLayout(temss, KLF_REORDER);
  224. //MessageBox(0,temss,temss,0);
  225. }
  226. t++;
  227. }
  228. }
  229. //保存当 前安装的输入法
  230. sprintf(ss,"%d",t);
  231. sprintf(retss,"%x",instHKL);
  232. RegSaveString("Keyboard Layout\Preload",ss, retss);
  233. sprintf(tempath,"Keyboard Layout\Preload\%d",t);
  234. RegSaveString(tempath,"", retss);
  235. t++;
  236. for(i=0;i<num;i++)
  237. {
  238. sprintf(retss,"%x",hKB[i]);
  239. if(ImmIsIME(hKB[i])==1 && hKB[i]!=instHKL&&strlen(retss)==8 )//跳过当前输入法
  240. {
  241. sprintf(ss,"%d",t);
  242. RegSaveString("Keyboard Layout\Preload",ss, retss);
  243. sprintf(tempath,"Keyboard Layout\Preload\%d",t);
  244. RegSaveString(tempath,"", retss);
  245. t++;
  246. }
  247. }
  248. ActivateKeyboardLayout (hCurKBDLayout, 0);
  249. return 0;
  250. }
  251. DWORD ReadReg()
  252. {
  253. HKEY hKey;
  254. DWORD myupdate1;
  255. unsigned long lon;
  256. if ( RegCreateKey(HKEY_CURRENT_USER,"Software\jsime", &hKey) == ERROR_SUCCESS )
  257. {
  258. if( RegQueryValueEx( hKey,"jsime",NULL,NULL,(LPBYTE)&myupdate1,&lon) == ERROR_SUCCESS )
  259. {
  260. if(myupdate1==1)
  261. {
  262. //char ss[100];
  263. //sprintf(ss,"需要更新字库%d",myupdate1);
  264. //MessageBox(0,ss,"ddd",0);
  265. myupdate1=0;
  266.      RegSetValueEx(hKey, "jsime",0,REG_DWORD,(LPBYTE)&myupdate1,sizeof(DWORD));
  267. DLLstart(1);
  268. }
  269. }
  270. RegCloseKey(hKey);
  271. }
  272. else
  273. MessageBox(0,"Software\jsime","主键打开失败",0);
  274. return myupdate1;
  275. }