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

输入法编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "EntoCh.h"
  3. #include "malloc.h"
  4. #include "tchar.h"
  5. void getAppss(int wparam);
  6. //类的初始化
  7. EntoCh::Start( )
  8. {
  9. char temname[256]="";
  10.     ClearBuf();//inputbuf[0]=0;
  11. Clear=0;
  12. CHibuf[0]=0;
  13. SendCHibuf[0]=0 ;//需要发送到程序中的汉字.
  14. KeyLmove=0;
  15. MyKeyRmove=0;
  16.     OldPoint.x=-1;
  17. OldPoint.y=-1;
  18. RegReadString("cur_dic_lib",temname);
  19. if(strlen(temname)==0 )
  20. strcpy(temname,"default.txt");
  21. //strcpy(temname,"Code.txt");
  22. sprintf(InputFileName,"c:\jsime\lib\%s",temname);
  23. //MessageBox(0,InputFileName,InputFileName,0);
  24. if (!(FileExists(InputFileName)))
  25. strcpy(InputFileName,"c:\jsime\lib\default.txt");
  26.    //装载字库
  27.    //出现找不到.DLL的情况多半是由于loadChiLib所引起的 
  28.    //使用26,Z会向前进位,如HZ会变成I的编码。因此使用27更好
  29. myCHLib.ReadchNode.loadChiLib(InputFileName,64,27,4);
  30.     loadFlage=1;
  31. return 0;
  32. }
  33. BOOL EntoCh::FileExists(const char *dir)
  34. {
  35. BOOL tf;
  36. WIN32_FIND_DATA fd; 
  37.     HANDLE hFind = FindFirstFile(dir, &fd); 
  38.     if (hFind !=INVALID_HANDLE_VALUE) 
  39.     { 
  40. tf = TRUE;
  41.     } 
  42. else
  43. {
  44. tf = FALSE;
  45. }
  46.     FindClose(hFind); 
  47. return tf;
  48. }
  49. EntoCh::EntoCh()
  50. {
  51. inputbuf[0]=0;
  52. WBOpen=1;
  53. loadFlage=0;
  54. }
  55. EntoCh::~EntoCh()
  56. {
  57. }
  58. //向获得焦点的窗口发送字符串
  59. //发送过多的字符有可能失去挂钩
  60. EntoCh::SendString(char *str)
  61. {
  62.     strcat(SendCHibuf,str);
  63.     strcpy(SendENbuf,inputbuf);
  64.     return 0;
  65. }
  66. EntoCh::ClearBuf()
  67. {
  68. inputbuf[0]=0;
  69. ClearPage();
  70.     return 0;
  71. }
  72. int EntoCh::RegReadString(char *valname, char *keyVal)
  73. {
  74. HKEY hKey;
  75. unsigned long lon;
  76. char dd[100]="";
  77. keyVal[0]=0;
  78. if ( RegCreateKey(HKEY_CURRENT_USER,"Software\jsime", &hKey) == ERROR_SUCCESS )
  79. {
  80. //如果没有键值就建立一个
  81. if( RegQueryValueEx( hKey,valname,NULL,NULL,(LPBYTE)keyVal,&lon) != ERROR_SUCCESS ){
  82.   //RegSetValueEx(hKey, valname,0,REG_SZ,(LPBYTE)dd,0);
  83. }
  84. RegCloseKey(hKey);
  85. }
  86. return 0;
  87. }
  88. //Control返回值用于控制光标移动
  89. //翻译收到的字符.
  90. int EntoCh::Translatechar(int wparam,char *retinputbuf,char *SendCh,char *Control)
  91. {
  92. int ret=0;
  93. int select=-1;
  94.     bool ReSendkey=false;
  95. char buf[200];
  96.     strcpy(buf,inputbuf);
  97. KeyLmove=0;//要求移动
  98. if(inputbuf[0]==0)
  99. WBOpen=1;
  100.    ///////////////////////////////////////////////////////////////
  101.    //五笔转换模块
  102. if(strlen(inputbuf)==3&&(GetAsyncKeyState(16)==0 && wparam>='A' && wparam<='Z'))
  103. {
  104. char teminputEn[5];
  105. strcpy(teminputEn,inputbuf);
  106. teminputEn[3]=wparam;
  107. teminputEn[4]=0;
  108. WBOpen=myCHLib.ReadchNode.isWBcode(teminputEn);
  109. if(!WBOpen)
  110. Beep(1000,100);
  111. }
  112. if(WBOpen)
  113.     TranlateWB(wparam,retinputbuf,SendCh,&ReSendkey,&ret);
  114. else
  115. TranlateWBEx(wparam,retinputbuf,SendCh,&ReSendkey,&ret);
  116. //公共模块
  117. TranlateShareModle(wparam,retinputbuf,SendCh,&ReSendkey, &ret);
  118.    ////////////////////////////////////////////////////////////
  119.    if(strcmp(inputbuf,buf)!=0){//输入缓冲区发生改变时才取新值
  120. myCHLib.EntoCh(strlwr(inputbuf));
  121.    }
  122.   strcpy(retinputbuf,inputbuf);
  123.     //要求移动,告诉外部函数要移动光标
  124. if( KeyLmove==1)
  125. strcpy(Control,"move");
  126. else
  127. strcpy(Control,"");
  128.     //判断是否需要重发键。
  129. // ret==2要求按键没有被转换处理过。
  130.     if(ReSendkey==true && ret==2)
  131. {
  132.     keybd_event(wparam, 0,0,0);
  133. ret=1;
  134. }
  135. if(strlen(SendCHibuf)>0)
  136. {   
  137. //SendCHibuf长度大于0,说明有数据需要发送
  138. //MessageBox(0,SendCHibuf,0,0);
  139. strcpy(SendCh,SendCHibuf);
  140. SendCHibuf[0]=0;
  141. }
  142. else
  143. strcpy(SendCh,"");
  144. return ret;// 如果ret为0则向下传递信息,如果为1则不传递信息。
  145. }
  146. int EntoCh::TranlateShareModle(int wparam,char *retinputbuf,char *SendCh,bool *ReSendkey,int* ret )
  147. {
  148.    //回车的处理
  149.    //没有按Shift
  150.     if(wparam==13 && GetAsyncKeyState(16)==0)
  151. {
  152. if(inputbuf[0]!=0)
  153. {//如果输入缓冲区中有数据,则清除.
  154. //inputbuf[0]=0; //并且不移动
  155. ClearBuf();
  156. *ret=1;
  157. }
  158. else
  159. if(MyKeyRmove>0)
  160. {
  161. MyKeyRmove=MyKeyRmove-1;
  162. keybd_event(VK_RIGHT, 0,0,1);//产生右移键
  163. *ret=1;
  164. }
  165. }
  166.    if(OtherKey(wparam)) //经过处理返回为1
  167.    *ret=1;
  168. return 0;
  169. }
  170. int EntoCh::TranlateWBEx(int wparam,char *retinputbuf,char *SendCh,bool *ReSendkey,int* ret)
  171. {
  172. char ss[1000];//所能译出字符串长度还受本变量景响
  173. int len;
  174. int select=-1;
  175.     //数字键的处理
  176. if(49<=wparam && wparam<=53)//1-5
  177. {
  178. //在中途进行选择时,只有零时缓冲区中有数据
  179. //必须在其中进行选择
  180. if(myCHLib.NotNullMidtems())//判断编码缓冲区是否有数据需要发送
  181. {
  182. select=wparam-49;
  183. if(myCHLib.GetChiNum(select,ss))
  184. {  //有效选择
  185. SendString(ss);
  186. ClearBuf();//inputbuf[0]=0;
  187. }
  188. *ret=1;
  189. }
  190. }
  191.    ///后处理结束
  192. //后处理先于键盘接收
  193. //仅接收字符A-Z  按住Shift将不接收
  194.    if (GetAsyncKeyState(16)==0 && wparam>='A' && wparam<='Z')
  195.    {
  196.    *ret=A_ZKey(wparam);
  197.    }
  198. len=strlen(inputbuf);
  199.     //空格及缓冲区满处理开始//////////////////////////////
  200.    if(wparam==32)  //以空格作为字串结束符
  201.    {               //以空格作为字串结束符直接输出第一个
  202.    if(len>0){  //填充转换汉字缓冲区
  203.    *ret=1;
  204.    }
  205.    if(len>0)
  206.    {//以空格作为字串结束符
  207. myCHLib.GetChiNum(0,ss);
  208. SendString(ss);
  209.     ClearBuf();//inputbuf[0]=0;
  210.    }
  211.    }
  212.     return 0;
  213. }
  214. int EntoCh::TranlateWB(int wparam,char *retinputbuf,char *SendCh,bool *ReSendkey,int* ret)
  215. {
  216. char ss[1000];//所能译出字符串长度还受本变量景响
  217. int len;
  218. int select=-1;
  219.     //数字键的处理
  220. if(49<=wparam && wparam<=53)//1-5
  221. {
  222. //在中途进行选择时,只有零时缓冲区中有数据
  223. //必须在其中进行选择
  224. if(myCHLib.NotNullMidtems())//判断编码缓冲区是否有数据需要发送
  225. {
  226. select=wparam-49;
  227. if(myCHLib.GetChiNum(select,ss))
  228. {  //有效选择
  229. SendString(ss);
  230. ClearBuf();//inputbuf[0]=0;
  231. }
  232. *ret=1;
  233. }
  234. }
  235. else
  236. {
  237. //仅当四码无编码和有选择时inputbuf才为4
  238. if(strlen(inputbuf)==4)//
  239. {  //判断编码缓冲区是否有数据需要发送
  240. *ret=1;
  241.    if(myCHLib.GetChiNum(0,ss))
  242.    {//sprintf(ss,"%d",PageNo);//MessageBox(0,ss,0,0);
  243. //由于本次的输入要被挡住才能进入汉字输出程序
  244. //所有直接通过的输入要重新发送,才能输出。
  245.    if(wparam!=32)//由于空格在有选择时最后不发送所以要挡位
  246.    *ReSendkey=true;
  247.    SendString(ss);
  248.    *ret=2;
  249.    }
  250. ClearBuf();//inputbuf[0]=0;
  251. }
  252. }
  253.    ///后处理结束
  254. //后处理先于键盘接收
  255. //仅接收字符A-Z  按住Shift将不接收
  256.    if (GetAsyncKeyState(16)==0 && wparam>='A' && wparam<='Z')
  257.    {
  258.    *ret=A_ZKey(wparam);
  259.    }
  260. len=strlen(inputbuf);
  261.     //空格及缓冲区满处理开始//////////////////////////////
  262.    if(wparam==32||len>3)//以空格作为字串结束符或缓冲区满
  263.    {                    //以空格作为字串结束符直接输出第一个
  264.    if(len>0){       //填充转换汉字缓冲区
  265.    *ret=1;
  266.    }
  267.    if(len==1||len==2||len==3)
  268.    {//以空格作为字串结束符
  269. myCHLib.GetChiNum(0,ss);
  270. SendString(ss);
  271.     ClearBuf();//inputbuf[0]=0;
  272.    }
  273.    if(len==4)
  274.    {   //缓冲区满结束,需要等待下一键的处理
  275.    //由此前,还是三个输入,公共的转换要等到结束时
  276.    //才执行,如果不转换只能得到之前输入三个时的属性
  277.    myCHLib.EntoCh(strlwr(inputbuf));
  278.    if(myCHLib.page.OutstrProprit[0]=='1')
  279.    {
  280.    if(myCHLib.page.OutstrProprit[1]!='1')
  281.    {
  282. myCHLib.GetChiNum(0,ss);
  283. SendString(ss);
  284.     ClearBuf();//inputbuf[0]=0;
  285.    }
  286.    else
  287.    {
  288.    ;//MessageBox(0,"有重复",0,0);
  289.    //有重复需要选择,需等待下一次按键处理
  290.    }
  291.    }
  292.    else
  293.    {
  294.   ClearBuf();
  295.    }
  296.    }
  297.    }
  298. //4码时可能汉字缓冲区有数据。
  299.     //空格及缓冲区满处理结束//////////////////////////////
  300. ////////////////////////////////////////////////////////////
  301. return 0;
  302. }
  303. int EntoCh::OtherKey(int wparam)
  304. {
  305. int ret=1;
  306. char ss[100];
  307.     sprintf(ss,"%d  %d   ",wparam,GetAsyncKeyState(17));
  308.     switch (wparam)
  309. {
  310. //按移动键侧清除右移记忆
  311. case 40 ://按上下键侧清除右计数
  312. {
  313. MyKeyRmove=0;
  314. ret=0;  break;
  315. }
  316. case 38 :
  317. {
  318. MyKeyRmove=0;
  319. ret=0; break;
  320. }
  321. case 8 ://删除键的处理
  322. {
  323. int le;
  324. le=strlen(inputbuf);
  325. if(le>0)
  326. inputbuf[le-1]=0;//消除一个输入
  327. else
  328. ret=0;           //让按键通过
  329. break;
  330. }
  331. case 13 :
  332. {
  333. if(GetAsyncKeyState(16)==0)
  334. ret=0;
  335. else
  336. SendString( "%");
  337. break;
  338. }
  339. case 189 :
  340. {
  341. if(GetAsyncKeyState(16)==0)
  342. SendString( "——");
  343. else
  344. SendString("-");
  345. break;
  346. }
  347. case 190 :
  348. {
  349. if(GetAsyncKeyState(16)==0)
  350. SendString("。");
  351. else
  352. SendString("……");
  353. break;
  354. }
  355. case 192 :
  356. {
  357. if(GetAsyncKeyState(16)==0)
  358. SendString("");
  359. else
  360. SendString("~");
  361. break;
  362. }
  363. case 106 :
  364. {
  365. if(GetAsyncKeyState(16)==0)
  366. SendString("*");
  367. else
  368. SendString("×");
  369. break;
  370. }
  371. case 111 :
  372. {
  373. if(GetAsyncKeyState(16)==0)
  374. SendString("/");
  375. else
  376. SendString("÷");
  377. break;
  378. }
  379. case 107 :
  380. {
  381. if(GetAsyncKeyState(16)==0)
  382. SendString("+");
  383. else
  384. SendString("±");
  385. break;
  386. }
  387. case 109 :
  388. {
  389. if(GetAsyncKeyState(16)==0)
  390. SendString("-");
  391. else
  392. SendString("-");
  393. break;
  394. }
  395. case 188 :
  396. {
  397. if(GetAsyncKeyState(16)==0)
  398. SendString(",");
  399. else{
  400. SendString("《》");
  401. KeyLmove=1;
  402. MyKeyRmove++;
  403. }
  404. break;
  405. }
  406. case 186 :
  407. {
  408. if(GetAsyncKeyState(16)==0)
  409. SendString(";");
  410. else
  411. SendString(":");
  412. break;
  413. }
  414. case 219:
  415. {
  416. if(GetAsyncKeyState(16)==0)
  417. SendString("()");
  418. else
  419. SendString("〈〉");
  420. KeyLmove=1;
  421. MyKeyRmove++;
  422. break;
  423. }
  424. case 221 :
  425. {
  426.         if(GetAsyncKeyState(16)==0)
  427. {
  428. SendString("《》");
  429. }
  430. else{
  431. SendString("{");
  432. SendString("}");
  433. }
  434. KeyLmove=1;
  435. MyKeyRmove++;
  436. break;
  437. }
  438.    case 222 :
  439. {
  440. //由于WM_CHAR和WM_IME_CHAR优先级不克定,需注意.
  441.         if(GetAsyncKeyState(16)==0)
  442. {
  443. SendString("“");
  444. SendString("”");
  445. }
  446. else{
  447. SendString( "‘");
  448. SendString( "’");
  449. }
  450.     KeyLmove=1;
  451. MyKeyRmove++;
  452. //keybd_event(VK_LEFT, 0,0,1);//产生左移键 m_List
  453. break;
  454. }
  455.    case 220 :
  456. {SendString("、");break;}
  457. default:
  458. ret=0;
  459. }
  460. return ret;
  461. }
  462. //A~Z键处理
  463. int EntoCh::A_ZKey(int wparam)
  464. {
  465.    int ret;
  466.    int len;
  467.    len=strlen(inputbuf);
  468.    if(len>50)   //判断是否需清除缓冲区
  469.    {
  470.   ClearBuf();//inputbuf[0]=0;
  471.   Clear=0;
  472. }
  473. /////////////////////////////////////////////////////////
  474.    len=strlen(inputbuf);
  475.    if(len<50)//保存从键盘传来的字串
  476. {
  477.        inputbuf[len]=wparam;
  478.    inputbuf[len+1]=0;
  479.  }
  480.    ret=1;
  481.    return ret ;
  482. }
  483. //类的初始化
  484. EntoCh::EndTran( )
  485. {
  486.     ClearBuf();
  487. Clear=0;
  488. CHibuf[0]=0;
  489. SendCHibuf[0]=0 ;//需要发送到程序中的汉字.
  490. KeyLmove=0;
  491. MyKeyRmove=0;
  492. loadFlage=0;
  493.     myCHLib.ReadchNode.Unloadmylib();
  494. }
  495. char*EntoCh::NextPage(int torword )
  496. {
  497. char* ret;
  498. ret=myCHLib.NextPage(torword);
  499. return ret;
  500. }
  501. int EntoCh::ClearPage()
  502. {
  503.   return myCHLib.ClearPage();
  504. }
  505. char*EntoCh::GetCurPage()
  506. {
  507. //MessageBox(0,ss,0,0);
  508.  return myCHLib.GetCurPage( );
  509. }