EntoCh.cpp
上传用户:hyb6888
上传日期:2016-01-24
资源大小:5186k
文件大小:11k
- #include "stdafx.h"
- #include "EntoCh.h"
- #include "malloc.h"
- #include "tchar.h"
- void getAppss(int wparam);
- //类的初始化
- EntoCh::Start( )
- {
- char temname[256]="";
- ClearBuf();//inputbuf[0]=0;
- Clear=0;
- CHibuf[0]=0;
- SendCHibuf[0]=0 ;//需要发送到程序中的汉字.
- KeyLmove=0;
- MyKeyRmove=0;
- OldPoint.x=-1;
- OldPoint.y=-1;
- RegReadString("cur_dic_lib",temname);
- if(strlen(temname)==0 )
- strcpy(temname,"default.txt");
- //strcpy(temname,"Code.txt");
- sprintf(InputFileName,"c:\jsime\lib\%s",temname);
- //MessageBox(0,InputFileName,InputFileName,0);
- if (!(FileExists(InputFileName)))
- strcpy(InputFileName,"c:\jsime\lib\default.txt");
- //装载字库
- //出现找不到.DLL的情况多半是由于loadChiLib所引起的
- //使用26,Z会向前进位,如HZ会变成I的编码。因此使用27更好
-
- myCHLib.ReadchNode.loadChiLib(InputFileName,64,27,4);
- loadFlage=1;
- return 0;
- }
- BOOL EntoCh::FileExists(const char *dir)
- {
- BOOL tf;
- WIN32_FIND_DATA fd;
- HANDLE hFind = FindFirstFile(dir, &fd);
- if (hFind !=INVALID_HANDLE_VALUE)
- {
- tf = TRUE;
- }
- else
- {
- tf = FALSE;
- }
- FindClose(hFind);
- return tf;
- }
- EntoCh::EntoCh()
- {
- inputbuf[0]=0;
- WBOpen=1;
- loadFlage=0;
- }
- EntoCh::~EntoCh()
- {
- }
- //向获得焦点的窗口发送字符串
- //发送过多的字符有可能失去挂钩
- EntoCh::SendString(char *str)
- {
- strcat(SendCHibuf,str);
- strcpy(SendENbuf,inputbuf);
- return 0;
- }
- EntoCh::ClearBuf()
- {
- inputbuf[0]=0;
- ClearPage();
- return 0;
- }
- int EntoCh::RegReadString(char *valname, char *keyVal)
- {
- HKEY hKey;
- unsigned long lon;
- char dd[100]="";
- keyVal[0]=0;
- if ( RegCreateKey(HKEY_CURRENT_USER,"Software\jsime", &hKey) == ERROR_SUCCESS )
- {
- //如果没有键值就建立一个
- if( RegQueryValueEx( hKey,valname,NULL,NULL,(LPBYTE)keyVal,&lon) != ERROR_SUCCESS ){
- //RegSetValueEx(hKey, valname,0,REG_SZ,(LPBYTE)dd,0);
- }
- RegCloseKey(hKey);
- }
- return 0;
- }
- //Control返回值用于控制光标移动
- //翻译收到的字符.
- int EntoCh::Translatechar(int wparam,char *retinputbuf,char *SendCh,char *Control)
- {
- int ret=0;
- int select=-1;
- bool ReSendkey=false;
- char buf[200];
- strcpy(buf,inputbuf);
- KeyLmove=0;//要求移动
- if(inputbuf[0]==0)
- WBOpen=1;
- ///////////////////////////////////////////////////////////////
- //五笔转换模块
- if(strlen(inputbuf)==3&&(GetAsyncKeyState(16)==0 && wparam>='A' && wparam<='Z'))
- {
- char teminputEn[5];
- strcpy(teminputEn,inputbuf);
- teminputEn[3]=wparam;
- teminputEn[4]=0;
- WBOpen=myCHLib.ReadchNode.isWBcode(teminputEn);
- if(!WBOpen)
- Beep(1000,100);
- }
- if(WBOpen)
- TranlateWB(wparam,retinputbuf,SendCh,&ReSendkey,&ret);
- else
- TranlateWBEx(wparam,retinputbuf,SendCh,&ReSendkey,&ret);
- //公共模块
- TranlateShareModle(wparam,retinputbuf,SendCh,&ReSendkey, &ret);
-
- ////////////////////////////////////////////////////////////
- if(strcmp(inputbuf,buf)!=0){//输入缓冲区发生改变时才取新值
- myCHLib.EntoCh(strlwr(inputbuf));
- }
- strcpy(retinputbuf,inputbuf);
- //要求移动,告诉外部函数要移动光标
- if( KeyLmove==1)
- strcpy(Control,"move");
- else
- strcpy(Control,"");
- //判断是否需要重发键。
- // ret==2要求按键没有被转换处理过。
- if(ReSendkey==true && ret==2)
- {
- keybd_event(wparam, 0,0,0);
- ret=1;
- }
- if(strlen(SendCHibuf)>0)
- {
- //SendCHibuf长度大于0,说明有数据需要发送
- //MessageBox(0,SendCHibuf,0,0);
- strcpy(SendCh,SendCHibuf);
- SendCHibuf[0]=0;
- }
- else
- strcpy(SendCh,"");
- return ret;// 如果ret为0则向下传递信息,如果为1则不传递信息。
- }
- int EntoCh::TranlateShareModle(int wparam,char *retinputbuf,char *SendCh,bool *ReSendkey,int* ret )
- {
- //回车的处理
- //没有按Shift
- if(wparam==13 && GetAsyncKeyState(16)==0)
- {
- if(inputbuf[0]!=0)
- {//如果输入缓冲区中有数据,则清除.
- //inputbuf[0]=0; //并且不移动
- ClearBuf();
- *ret=1;
- }
- else
- if(MyKeyRmove>0)
- {
- MyKeyRmove=MyKeyRmove-1;
- keybd_event(VK_RIGHT, 0,0,1);//产生右移键
- *ret=1;
- }
- }
- if(OtherKey(wparam)) //经过处理返回为1
- *ret=1;
- return 0;
- }
- int EntoCh::TranlateWBEx(int wparam,char *retinputbuf,char *SendCh,bool *ReSendkey,int* ret)
- {
- char ss[1000];//所能译出字符串长度还受本变量景响
- int len;
- int select=-1;
- //数字键的处理
- if(49<=wparam && wparam<=53)//1-5
- {
- //在中途进行选择时,只有零时缓冲区中有数据
- //必须在其中进行选择
- if(myCHLib.NotNullMidtems())//判断编码缓冲区是否有数据需要发送
- {
- select=wparam-49;
- if(myCHLib.GetChiNum(select,ss))
- { //有效选择
- SendString(ss);
- ClearBuf();//inputbuf[0]=0;
- }
- *ret=1;
- }
- }
- ///后处理结束
- //后处理先于键盘接收
- //仅接收字符A-Z 按住Shift将不接收
- if (GetAsyncKeyState(16)==0 && wparam>='A' && wparam<='Z')
- {
- *ret=A_ZKey(wparam);
- }
- len=strlen(inputbuf);
- //空格及缓冲区满处理开始//////////////////////////////
- if(wparam==32) //以空格作为字串结束符
- { //以空格作为字串结束符直接输出第一个
- if(len>0){ //填充转换汉字缓冲区
- *ret=1;
- }
- if(len>0)
- {//以空格作为字串结束符
- myCHLib.GetChiNum(0,ss);
- SendString(ss);
- ClearBuf();//inputbuf[0]=0;
- }
- }
- return 0;
- }
- int EntoCh::TranlateWB(int wparam,char *retinputbuf,char *SendCh,bool *ReSendkey,int* ret)
- {
- char ss[1000];//所能译出字符串长度还受本变量景响
- int len;
- int select=-1;
- //数字键的处理
- if(49<=wparam && wparam<=53)//1-5
- {
- //在中途进行选择时,只有零时缓冲区中有数据
- //必须在其中进行选择
- if(myCHLib.NotNullMidtems())//判断编码缓冲区是否有数据需要发送
- {
- select=wparam-49;
- if(myCHLib.GetChiNum(select,ss))
- { //有效选择
- SendString(ss);
- ClearBuf();//inputbuf[0]=0;
- }
- *ret=1;
- }
- }
- else
- {
- //仅当四码无编码和有选择时inputbuf才为4
- if(strlen(inputbuf)==4)//
- { //判断编码缓冲区是否有数据需要发送
- *ret=1;
- if(myCHLib.GetChiNum(0,ss))
- {//sprintf(ss,"%d",PageNo);//MessageBox(0,ss,0,0);
- //由于本次的输入要被挡住才能进入汉字输出程序
- //所有直接通过的输入要重新发送,才能输出。
- if(wparam!=32)//由于空格在有选择时最后不发送所以要挡位
- *ReSendkey=true;
- SendString(ss);
- *ret=2;
- }
- ClearBuf();//inputbuf[0]=0;
- }
- }
- ///后处理结束
- //后处理先于键盘接收
- //仅接收字符A-Z 按住Shift将不接收
- if (GetAsyncKeyState(16)==0 && wparam>='A' && wparam<='Z')
- {
- *ret=A_ZKey(wparam);
- }
- len=strlen(inputbuf);
- //空格及缓冲区满处理开始//////////////////////////////
- if(wparam==32||len>3)//以空格作为字串结束符或缓冲区满
- { //以空格作为字串结束符直接输出第一个
- if(len>0){ //填充转换汉字缓冲区
- *ret=1;
- }
- if(len==1||len==2||len==3)
- {//以空格作为字串结束符
- myCHLib.GetChiNum(0,ss);
- SendString(ss);
- ClearBuf();//inputbuf[0]=0;
- }
- if(len==4)
- { //缓冲区满结束,需要等待下一键的处理
- //由此前,还是三个输入,公共的转换要等到结束时
- //才执行,如果不转换只能得到之前输入三个时的属性
- myCHLib.EntoCh(strlwr(inputbuf));
- if(myCHLib.page.OutstrProprit[0]=='1')
- {
- if(myCHLib.page.OutstrProprit[1]!='1')
- {
- myCHLib.GetChiNum(0,ss);
- SendString(ss);
- ClearBuf();//inputbuf[0]=0;
- }
- else
- {
- ;//MessageBox(0,"有重复",0,0);
- //有重复需要选择,需等待下一次按键处理
- }
- }
- else
- {
- ClearBuf();
- }
- }
- }
- //4码时可能汉字缓冲区有数据。
- //空格及缓冲区满处理结束//////////////////////////////
- ////////////////////////////////////////////////////////////
- return 0;
- }
- int EntoCh::OtherKey(int wparam)
- {
- int ret=1;
- char ss[100];
- sprintf(ss,"%d %d ",wparam,GetAsyncKeyState(17));
- switch (wparam)
- {
- //按移动键侧清除右移记忆
- case 40 ://按上下键侧清除右计数
- {
- MyKeyRmove=0;
- ret=0; break;
- }
- case 38 :
- {
- MyKeyRmove=0;
- ret=0; break;
- }
- case 8 ://删除键的处理
- {
- int le;
- le=strlen(inputbuf);
- if(le>0)
- inputbuf[le-1]=0;//消除一个输入
- else
- ret=0; //让按键通过
- break;
- }
- case 13 :
- {
- if(GetAsyncKeyState(16)==0)
- ret=0;
- else
- SendString( "%");
- break;
- }
- case 189 :
- {
- if(GetAsyncKeyState(16)==0)
- SendString( "——");
- else
- SendString("-");
- break;
- }
- case 190 :
- {
- if(GetAsyncKeyState(16)==0)
- SendString("。");
- else
- SendString("……");
- break;
- }
- case 192 :
- {
- if(GetAsyncKeyState(16)==0)
- SendString("");
- else
- SendString("~");
- break;
- }
- case 106 :
- {
- if(GetAsyncKeyState(16)==0)
- SendString("*");
- else
- SendString("×");
- break;
- }
- case 111 :
- {
- if(GetAsyncKeyState(16)==0)
- SendString("/");
- else
- SendString("÷");
- break;
- }
- case 107 :
- {
- if(GetAsyncKeyState(16)==0)
- SendString("+");
- else
- SendString("±");
- break;
- }
- case 109 :
- {
- if(GetAsyncKeyState(16)==0)
- SendString("-");
- else
- SendString("-");
- break;
- }
- case 188 :
- {
- if(GetAsyncKeyState(16)==0)
- SendString(",");
- else{
- SendString("《》");
- KeyLmove=1;
- MyKeyRmove++;
- }
- break;
- }
- case 186 :
- {
- if(GetAsyncKeyState(16)==0)
- SendString(";");
- else
- SendString(":");
- break;
- }
- case 219:
- {
- if(GetAsyncKeyState(16)==0)
- SendString("()");
- else
- SendString("〈〉");
- KeyLmove=1;
- MyKeyRmove++;
- break;
- }
- case 221 :
- {
- if(GetAsyncKeyState(16)==0)
- {
- SendString("《》");
- }
- else{
- SendString("{");
- SendString("}");
- }
- KeyLmove=1;
- MyKeyRmove++;
- break;
- }
- case 222 :
- {
- //由于WM_CHAR和WM_IME_CHAR优先级不克定,需注意.
- if(GetAsyncKeyState(16)==0)
- {
- SendString("“");
- SendString("”");
- }
- else{
- SendString( "‘");
- SendString( "’");
- }
- KeyLmove=1;
- MyKeyRmove++;
- //keybd_event(VK_LEFT, 0,0,1);//产生左移键 m_List
- break;
- }
- case 220 :
- {SendString("、");break;}
- default:
- ret=0;
- }
- return ret;
- }
- //A~Z键处理
- int EntoCh::A_ZKey(int wparam)
- {
- int ret;
- int len;
- len=strlen(inputbuf);
- if(len>50) //判断是否需清除缓冲区
- {
- ClearBuf();//inputbuf[0]=0;
- Clear=0;
- }
- /////////////////////////////////////////////////////////
- len=strlen(inputbuf);
- if(len<50)//保存从键盘传来的字串
- {
- inputbuf[len]=wparam;
- inputbuf[len+1]=0;
- }
- ret=1;
- return ret ;
- }
- //类的初始化
- EntoCh::EndTran( )
- {
- ClearBuf();
- Clear=0;
- CHibuf[0]=0;
- SendCHibuf[0]=0 ;//需要发送到程序中的汉字.
- KeyLmove=0;
- MyKeyRmove=0;
- loadFlage=0;
- myCHLib.ReadchNode.Unloadmylib();
- }
- char*EntoCh::NextPage(int torword )
- {
- char* ret;
- ret=myCHLib.NextPage(torword);
- return ret;
- }
- int EntoCh::ClearPage()
- {
- return myCHLib.ClearPage();
- }
- char*EntoCh::GetCurPage()
- {
- //MessageBox(0,ss,0,0);
- return myCHLib.GetCurPage( );
- }