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

输入法编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "stdio.h"
  3. #include "imm.h"
  4. #include "jsIME.h"
  5. #include "DllManager.h"
  6. #include "resource.h"
  7. #include "stdio.h"
  8. HINSTANCE hInst;
  9. HWND  ActiveHwnd;  //提示窗口
  10. extern DllManager DllMns;
  11. extern HWND outMainhWnd;
  12. extern HWND hSoftKbdWnd;
  13. extern int  myFullErr;
  14. LPDWORD   lpdwCurTransKey = NULL;
  15. HIMC savehIMC=NULL;
  16. int  intinat=0;
  17. BOOL  IMESenChiApp(HIMC hIMC, char *ss);
  18. BOOL  GenerateMessage(HIMC hIMC, LPDWORD lpdwTransKey,LPGENEMSG lpGeneMsg);
  19. //如果出现LPIMEINFO等没有定义,可能是系统使用自带的Imm.h
  20. //   LPTSTR lpszWndClass,        //当前输入法的名称
  21. BOOL WINAPI ImeInquire(LPIMEINFO lpIMEInfo,LPTSTR lpszUIClass,LPCTSTR lpszOption)
  22. {
  23.     if (!lpIMEInfo) {
  24.         return (FALSE);
  25.     }
  26.     lpIMEInfo->dwPrivateDataSize = sizeof(PRIVCONTEXT);
  27.     lpIMEInfo->fdwProperty = IME_PROP_KBD_CHAR_FIRST|IME_PROP_IGNORE_UPKEYS;
  28.     lpIMEInfo->fdwConversionCaps = IME_CMODE_NATIVE|IME_CMODE_FULLSHAPE|
  29.         IME_CMODE_CHARCODE|IME_CMODE_SOFTKBD|IME_CMODE_NOCONVERSION;
  30.     lpIMEInfo->fdwSentenceCaps = 0;
  31.     // IME will have different distance base multiple of 900 escapement
  32.     lpIMEInfo->fdwUICaps = UI_CAP_ROT90|UI_CAP_SOFTKBD;
  33.     // composition string is the reading string for simple IME
  34.     lpIMEInfo->fdwSCSCaps = SCS_CAP_COMPSTR|SCS_CAP_MAKEREAD;
  35.     // IME want to decide conversion mode on ImeSelect
  36.     lpIMEInfo->fdwSelectCaps = (DWORD)NULL;
  37.     _tcscpy(lpszUIClass,UICLASSNAME);
  38.    return TRUE;
  39. }
  40. BOOL WINAPI ImeConfigure(HKL hKL,HWND hWnd, DWORD dwMode, LPVOID lpData)
  41. {
  42. MessageBox (0,"极速五笔无需进行输入法配置!!","极速五笔输入法配置对话框",0);
  43. return TRUE;
  44. }
  45. DWORD WINAPI ImeConversionList(HIMC hIMC,LPCTSTR lpSource,LPCANDIDATELIST lpCandList,DWORD dwBufLen,UINT uFlag)
  46. {
  47.     return 0;
  48. }
  49. BOOL WINAPI ImeDestroy(UINT uForce)
  50. {
  51.    //MessageBox (0,"ImeDestroy",0,0);
  52.    //DllMns.mgCloseWin();
  53.    return FALSE;
  54. }
  55. LRESULT WINAPI ImeEscape(HIMC hIMC,UINT uSubFunc,LPVOID lpData)
  56. {
  57. return FALSE;
  58. }
  59. //键盘过滤,0为不过滤
  60. BOOL WINAPI ImeProcessKey(HIMC hIMC,UINT vKey,LPARAM lKeyData,CONST LPBYTE lpbKeyState)
  61. {  
  62. BOOL ret=0;
  63. ret=DllMns.myImeProcessKey(&DllMns.hmainWin,DllMns.SendCH,DllMns.Control,hIMC,vKey,lKeyData, lpbKeyState);
  64.     
  65. //MessageBox (0,"dddd",DllMns.SendCH,0);
  66.     return ret;
  67. }
  68. //当本输入法被选中或被撤消时调用.
  69. BOOL WINAPI ImeSelect(HIMC hIMC, BOOL fSelect)
  70. {
  71. LPINPUTCONTEXT lpIMC;
  72.     // it's NULL context.
  73.     if (!hIMC)
  74.         return TRUE;
  75. if (!(lpIMC = ImmLockIMC(hIMC)))//锁存数据
  76.    return 1;
  77. savehIMC=hIMC;
  78. ImmUnlockIMC(hIMC);
  79. {
  80. char ss[100];
  81. sprintf(ss,"%d",lpIMC->hWnd);
  82. //MessageBox(0,ss,"ImeSelect",0);
  83. }
  84.     return 0;
  85. }
  86. BOOL WINAPI ImeSetActiveContext(HIMC hIMC,BOOL fFlag)
  87. {
  88.     return TRUE;
  89. }
  90. UINT WINAPI ImeToAsciiEx (UINT uVKey,UINT uScanCode,CONST LPBYTE lpbKeyState,
  91.   LPDWORD lpdwTransKey,UINT fuState,HIMC hIMC)
  92. {
  93. //把转换后的汉字发到接收程序中使用内部机制.
  94. // char ss[100];
  95. //MessageBox (0,"dddd",DllMns.SendCH,0);
  96. try{
  97.     if (uScanCode & 0x8000)
  98.         return 0;
  99.     else
  100. {
  101. if (strlen(DllMns.SendCH)){
  102. lpdwCurTransKey = lpdwTransKey;
  103. if(strcmp(DllMns.Control,"move")==0)
  104. keybd_event(VK_LEFT, 0,0,0);
  105. lpdwCurTransKey=lpdwTransKey;
  106. IMESenChiApp( hIMC,DllMns.SendCH);
  107. DllMns.SendCH[0]=0;
  108. }
  109. }
  110.  } catch (...) {
  111.   MessageBox(0,"ImeToAsciiEx","有错误发生",0);
  112.  }
  113. return 0;
  114. }
  115. BOOL WINAPI NotifyIME(HIMC hIMC,DWORD dwAction,DWORD dwIndex,DWORD dwValue)
  116. {
  117.     BOOL bRet = FALSE;
  118. // char ss[100];
  119. try {
  120.     switch(dwAction)
  121.     {
  122. case NI_CONTEXTUPDATED:
  123. switch (dwValue)
  124. {
  125. case IMC_SETOPENSTATUS:
  126.   ///////////////////////////////////////////////////
  127. // it's NULL context.
  128. DllMns.mgUpDateaWin(hIMC);
  129. bRet = TRUE;
  130. break;
  131. case IMC_SETCOMPOSITIONFONT:
  132. //if(dwValue!=12)
  133. //{
  134. //sprintf(ss,"%d",dwValue);
  135. //MessageBox(0,ss,0,0);
  136. //}
  137. //DllMns.mgSetShowString("","");
  138. //DllMns.mgHideWin();
  139. bRet = TRUE;
  140. break;
  141. default:
  142. break;
  143. }
  144. break;
  145. case NI_COMPOSITIONSTR:
  146. DllMns.mgSetShowString("","");
  147. DllMns.mgHideWin();
  148. bRet = TRUE;
  149. break;
  150.     }
  151.  } catch (...) {
  152.   MessageBox(0,"ImeToAsciiEx","有错误发生",0);
  153.  }
  154.     return bRet;
  155. }
  156. BOOL WINAPI ImeRegisterWord(LPCTSTR lpRead, DWORD dw, LPCTSTR lpStr)
  157. {
  158.     return FALSE;
  159. }
  160. BOOL WINAPI ImeUnregisterWord(LPCTSTR lpRead, DWORD dw, LPCTSTR lpStr)
  161. {
  162.    return FALSE;
  163. }
  164. UINT WINAPI ImeGetRegisterWordStyle(UINT nItem, LPSTYLEBUF lp)
  165. {
  166. return 0;
  167. }
  168. UINT WINAPI ImeEnumRegisterWord(REGISTERWORDENUMPROC lpfn, LPCTSTR lpRead, DWORD dw, LPCTSTR lpStr, LPVOID lpData)
  169. {
  170. return 0;
  171. }
  172. BOOL WINAPI ImeSetCompositionString(HIMC hIMC, DWORD dwIndex, LPCVOID lpComp, DWORD dwComp, LPCVOID lpRead, DWORD dwRead)
  173. {
  174.     return FALSE;
  175. }
  176. //用于向系统发送消息
  177. BOOL GenerateMessage(HIMC hIMC, LPDWORD lpdwTransKey,LPGENEMSG lpGeneMsg)
  178. {
  179.     LPINPUTCONTEXT lpIMC;
  180. if( (lpIMC = ImmLockIMC(hIMC)) == NULL ) 
  181. return FALSE;
  182.     
  183.     if (IsWindow(lpIMC->hWnd))
  184.     {
  185.         LPDWORD lpdw;
  186.         if (!(lpIMC->hMsgBuf = ImmReSizeIMCC(lpIMC->hMsgBuf,
  187. sizeof(DWORD) * (lpIMC->dwNumMsgBuf +1) * 3)))
  188.             return FALSE;
  189.         if (!(lpdw = (LPDWORD)ImmLockIMCC(lpIMC->hMsgBuf)))
  190.             return FALSE;
  191.         lpdw += (lpIMC->dwNumMsgBuf) * 3;
  192.         *((LPGENEMSG)lpdw) = *lpGeneMsg;
  193.         ImmUnlockIMCC(lpIMC->hMsgBuf);
  194.         lpIMC->dwNumMsgBuf++;
  195.         ImmGenerateMessage(hIMC);
  196.     }
  197. ImmUnlockIMC(hIMC);
  198.     return TRUE;
  199. }
  200. //特殊字符处理
  201. int specsif(char *ss)
  202. {
  203. int i,t,t1,t2,len;
  204. //特殊字符处理,以便支持特殊字符了输入
  205. len=strlen(ss);
  206. if(len>=4)
  207. {
  208. t=-1;
  209. for(i=0;i<len;i++)
  210. {
  211. t++;
  212. t1=t2=-1;
  213. if(ss[i]=='0' && (ss[i+1]=='x'||ss[i+1]=='X') && i<len-2 )
  214. {
  215. if(ss[i+2]>='0' && ss[i+2]<='9')
  216. t1=ss[i+2]-'0';
  217. if(ss[i+2]>='a' && ss[i+2]<='f')
  218. t1=ss[i+2]-'a'+10;
  219. if(ss[i+2]>='A' && ss[i+2]<='F')
  220. t1=ss[i+2]-'A'+10;
  221. if(ss[i+3]>='0' && ss[i+3]<='9')
  222. t2=ss[i+3]-'0';
  223. if(ss[i+3]>='a' && ss[i+3]<='f')
  224. t2=ss[i+3]-'a'+10;
  225. if(ss[i+3]>='A' && ss[i+3]<='F')
  226. t2=ss[i+3]-'A'+10;
  227. }
  228. if(t1!=-1 && t2!=-1)
  229. {
  230. //char tem[100];
  231. //sprintf(tem,"%d %d",t1,t2);
  232. t1=t1*16+t2;
  233. ss[t]=t1;
  234. //MessageBox(0,tem,ss,0);
  235. i=i+3;
  236. }
  237. else
  238. ss[t]=ss[i];
  239. }
  240. ss[t+1]=0;
  241. }
  242. return 0;
  243. }
  244. //把转换后的汉字发到接收程序中使用内部机制.
  245. BOOL IMESenChiApp(HIMC hIMC, char *ss)
  246. {
  247. //内部发送在首次发送时可能失效,因此暂时不用
  248. specsif(ss);
  249. if(strlen(ss)<1)
  250. {
  251. GENEMSG GnMsg;
  252. LPCOMPOSITIONSTRING lpCompStr;
  253. LPINPUTCONTEXT lpIMC;
  254. lpIMC = ImmLockIMC(hIMC);
  255. lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
  256. if(strlen(ss))
  257. {
  258. strcpy(GETLPRESULTSTR(lpCompStr),ss);
  259. //_tcscpy(GETLPRESULTSTR(lpCompStr),"高点");
  260. lpCompStr->dwResultStrLen =strlen(ss);
  261. //{
  262. // char sss[100];
  263. // sprintf(sss,"%d",strlen(ss));
  264. // MessageBox(0,sss,0,0);
  265. //}
  266. GnMsg.msg = WM_IME_COMPOSITION;//
  267. GnMsg.wParam = 0;
  268. GnMsg.lParam = GCS_RESULTSTR;
  269. GenerateMessage(hIMC, 0,(LPGENEMSG)&GnMsg);
  270. }
  271. }
  272. else
  273. {
  274. //向获得焦点的窗口发送字符串
  275. //发送过多的字符有可能失去挂钩
  276. int i;
  277. for(i=0;i<(int)strlen(ss);)
  278. {
  279. if(ss[i]<0)
  280. {
  281. SendMessage(GetFocus(), WM_IME_CHAR, MAKEWORD(ss[i+1],ss[i]), 0);
  282.     i+=2;
  283. }
  284. else
  285. {
  286. SendMessage(GetFocus(), WM_IME_CHAR, MAKEWORD(ss[i],0), 1);
  287. if(ss[i]==13&&ss[i+1]==10)
  288. i++;
  289. i++;
  290. }
  291. }
  292. }
  293. ss[0]=0;
  294.     return TRUE; 
  295. }