请教输入法转换汉字过程? 本帖最后由 VisualEleven 于 2012-09-03 10:38:29 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 下载我的‘MyFreePy.rar’http://download.csdn.net/detail/schlafenhamster/1690580 下了你的程序看了。不是我要的。这个不是输入法是个应用程序。程序里定义了个CMyEdit 。里面处理键盘事件在调用KeydownHandler里面直接看空格键处理MakeResultString。然后SendMessage(g_DlgWnd,WM_HZTEXT,0,0);显示结果了吧。这个不是输入法的机制。中间拼音转换成汉字好象是用的自由拼音的方法。怎么样的编码转什么汉字我不关心。我只要“a”转成“我的输入法”。我想问:在输入法函数ImeToAsciiEx中怎么样把“a”转换成“我的输入法”,然后还要在那些函数中做什么处理,最后怎么把“我的输入法”传到应用程序的 ?请高手给我实现的代码 你不是要"把拼音转换成汉字"的过程吗?我的CMyEdit只是为了输出,移植到目标机就是你的输出窗口。 首先谢谢你的回答其次这是我的提问: 在输入法中 如果我要把用户输入的“a”转换成“我的输入法”具体在ImeToAsciiEx函数要做什么,还要在哪些函数中做什么处理,最后怎么把“我的输入法”传到应用程序的 ?请高手给我实现的代码。 刚刚又看了自由拼音。觉得最终调用的是ImmGenerateMessage(hIMC);这个函数。转换后的汉字就保存HICM这个结构中。如果我在ImeToAsciiEx拦截A键直接修改HIMC再调用ImmGenerateMessage 不知道能不能直接输出汉字? 回复于:2012-09-03 09:15:06下载我的‘MyFreePy.rar’http://download.csdn.net/detail/schlafenhamster/1690580 spy++看了一下...似乎还是WM_CHAR,不过输入法产生的都是扫描码为0的,汉字也是一个WM_CHAR表示的...只是看了消息,不清楚过程是怎么处理的... 没错是WM_CHAR。2楼的程序加个SENDMESSAGE 再加个IME框架他也可以 是个外挂式的输入法。我要的是IME是怎么发送出去汉字的 自由拼音输入法源码看这头痛。在空格键处理最终调用了ImmGenerateMessage(hIMC); 其间发送了WM_IME_STARTCOMPOSITION,WM_IME_COMPOSITION,和WM_IME_ENDCOMPOSITION,3个消息 都是调用ImmGenerateMessage,HIMC里面存有消息内容。和汉字内容 好像涉及到码表的问题。以前在win98下系统自带的输入法有个后缀为mb的文件。 我记得是GetChar单字节是ASCII的。双字节是unicode的。这并不是答案哦。同求答案。 windows的输入法一直都是有问题的。chrome浏览器最出的几个比较大的BUG里始终不离输入法的。用五笔打字的朋友都知道。计算机有点卡时,打字再快一些。很容易把系统打死的。 “需要处理WM_IME_COMPOSITION消息处理GCS_RESULTSTR命令,当用户使用输入法选定某一个候选字后,会发送WM_IME_COMPOSITION消息,携带GCS_RESULTSTR命令,此时可以使用ImmGetCompositionStringW函数获取用户选择的候选字的字符串”搜索“IME应用“ 能不能在详细点。。在自由拼音里面: GnMsg.msg = WM_IME_STARTCOMPOSITION; GnMsg.wParam = 0; GnMsg.lParam = 0; GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg); GnMsg.msg = WM_IME_COMPOSITION; GnMsg.wParam = 0; GnMsg.lParam = GCS_COMPSTR; GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);GnMsg.msg = WM_IME_ENDCOMPOSITION; GnMsg.wParam = 0; GnMsg.lParam = 0; GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg); GenerateMessage 最终是调用ImmGenerateMessage(hIMC);IME我不知道怎么调试。3次消息 的时候参数有什么不同lpdwCurTransKey这个参数貌似是ImeToAsciiEx传下来的。还有。 是不发送WM_IME_COMPOSITION 消息的时候就携带转换后的汉字。但是系统不会发送到应用程序。而在WM_IME_ENDCOMPOSITION;之后就会发送汉字到应用程序 我把自由拼音这几个函数放这里:UINT WINAPI ImeToAsciiEx (UINT uVKey,UINT uScanCode,CONST LPBYTE lpbKeyState,LPDWORD lpdwTransKey,UINT fuState,HIMC hIMC){ LPARAM lParam; LPINPUTCONTEXT lpIMC; BOOL fOpen; DebugLog(1,(DebugLogFile,"ImeToAsciiEx\n")); lpdwCurTransKey = lpdwTransKey; lParam = ((DWORD)uScanCode << 16) + 1L; // Init uNumTransKey here. uNumTransKey = 0; // if hIMC is NULL, this means DISABLE IME. if (!hIMC) return 0; if (!(lpIMC = ImmLockIMC(hIMC))) return 0; fOpen = lpIMC->fOpen; ImmUnlockIMC(hIMC); // The current status of IME is "closed". if (!fOpen) goto my_exit; if (uScanCode & 0x8000) IMEKeyupHandler( hIMC, uVKey, lParam, lpbKeyState); else IMEKeydownHandler( hIMC, uVKey, lParam, lpbKeyState); // Clear static value, no more generated message! lpdwCurTransKey = NULL;my_exit: // If trans key buffer that is allocated by USER.EXE full up, // the return value is the negative number. if (fOverTransKey) { return (int)uNumTransKey; } return (int)uNumTransKey;}BOOL CharHandler( HIMC hIMC, WORD wParam, LONG lParam){ LPINPUTCONTEXT lpIMC; LPCOMPOSITIONSTRING lpCompStr; LPCANDIDATEINFO lpCandInfo; DWORD dwStrLen; GENEMSG GnMsg; LPTSTR lpConvStr; lpIMC = ImmLockIMC(hIMC); lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr); dwStrLen = lpCompStr->dwCompStrLen; if (!dwStrLen) { lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo); ClearCompStr(lpCompStr); ClearCandidate(lpCandInfo); ImmUnlockIMCC(lpIMC->hCandInfo); GnMsg.msg = WM_IME_STARTCOMPOSITION; GnMsg.wParam = 0; GnMsg.lParam = 0; GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg); if(wParam == _T('#') ) { ImmUnlockIMCC(lpIMC->hCompStr); ImmUnlockIMC(hIMC); return RepeatPreResult(hIMC); } if( (wParam < _T('a') || wParam > _T('z')) && (wParam < _T('A') || wParam > _T('Z')) && (wParam < _T('0') || wParam > _T('9')) ){ ImmUnlockIMCC(lpIMC->hCompStr); ImmUnlockIMC(hIMC); return GeneratePunct(hIMC,wParam); } if( wParam == _T('i') ) { LPTSTR lpStr; wConversionMode |= CONVERSION_MODE_I; lpStr = GETLPCOMPSTR(lpCompStr); *lpStr = (TCHAR)wParam; *(lpStr+1) = _T('\0'); lpCompStr->dwCompStrLen = _tcslen(lpStr); lpStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPaintCompStr; _tcscpy(lpStr,IMODEL); GnMsg.msg = WM_IME_COMPOSITION; GnMsg.wParam = 0; GnMsg.lParam = GCS_COMPSTR; GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg); goto my_exit; } if( wParam == _T('u') ) { LPTSTR lpStr; wConversionMode |= CONVERSION_MODE_U; lpStr = GETLPCOMPSTR(lpCompStr); *lpStr = (TCHAR)wParam; *(lpStr+1) = _T('\0'); lpCompStr->dwCompStrLen = _tcslen(lpStr); lpStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPaintCompStr; _tcscpy(lpStr,UMODEL); GnMsg.msg = WM_IME_COMPOSITION; GnMsg.wParam = 0; GnMsg.lParam = GCS_COMPSTR; GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg); goto my_exit; } if( wParam == _T('v') ) { LPTSTR lpStr; wConversionMode |= CONVERSION_MODE_V; lpStr = GETLPCOMPSTR(lpCompStr); *lpStr = (TCHAR)wParam; *(lpStr+1) = _T('\0'); lpCompStr->dwCompStrLen = _tcslen(lpStr); lpStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPaintCompStr; _tcscpy(lpStr,VMODEL); GnMsg.msg = WM_IME_COMPOSITION; GnMsg.wParam = 0; GnMsg.lParam = GCS_COMPSTR; GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg); goto my_exit; } } if(wConversionMode & CONVERSION_MODE_PHRASETOCHAR) { if( CharHandlePhToCh(hIMC,wParam,lParam) ) goto my_exit; } else if(wConversionMode & CONVERSION_MODE_I) { if( CharHandleI(hIMC,wParam,lParam) ) goto my_exit; } else if(wConversionMode & CONVERSION_MODE_U) { if( CharHandleU(hIMC,wParam,lParam) ) goto my_exit; } else if(wConversionMode & CONVERSION_MODE_V) { if( CharHandleV(hIMC,wParam,lParam) ) goto my_exit; } else{ if( CharHandleNormal(hIMC,wParam,lParam) ) goto my_exit; } if( wParam >= _T('!') && wParam <= _T('~') && lpCompStr->dwCompStrLen == 0) { lpConvStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szConvCompStr; if(wConversionSet & CONVERSION_SET_FULLSHAPE) { BYTE bChar[4]; bChar[0] = 0xA3; bChar[1] = (BYTE)wParam + 0x80; bChar[2] = 0; bChar[3] = 0; memcpy((LPBYTE)lpConvStr,bChar,4); } else{ *lpConvStr = (TCHAR)wParam; *(lpConvStr+1) = _T('\0'); } MakeResultString(hIMC,TRUE); }my_exit: ImmUnlockIMCC(lpIMC->hCompStr); ImmUnlockIMC(hIMC); return TRUE;}BOOL MakeResultString( HIMC hIMC,BOOL fFlag){ GENEMSG GnMsg; LPCOMPOSITIONSTRING lpCompStr; LPINPUTCONTEXT lpIMC; LPTSTR lpConvStr,lpPreResultStr; LPCANDIDATEINFO lpCandInfo; LPCANDIDATELIST lpCandList;/* if (!IsCompStr(hIMC)) return FALSE;*/ wConversionMode = 0; lpIMC = ImmLockIMC(hIMC); lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr); lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo); lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]); if(fFlag) { lpConvStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szConvCompStr; lpPreResultStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPreResultStr; _tcscpy(GETLPRESULTSTR(lpCompStr),lpConvStr); _tcscpy(lpPreResultStr,lpConvStr); lpCompStr->dwResultStrLen = _tcslen(lpConvStr); } else{ *GETLPRESULTSTR(lpCompStr) = _T('\0'); lpCompStr->dwResultStrLen = 0; } lpCandList->dwCount = 0; lpCompStr->dwCompStrLen = 0; _tcscpy(GETLPCANDSTR(lpCandList,0),_T("")); _tcscpy(GETLPCANDSTR(lpCandList,1),_T("")); ImmUnlockIMCC(lpIMC->hCompStr); ImmUnlockIMCC(lpIMC->hCandInfo); GnMsg.msg = WM_IME_COMPOSITION; GnMsg.wParam = 0; GnMsg.lParam = GCS_RESULTSTR; GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg); GnMsg.msg = WM_IME_ENDCOMPOSITION; GnMsg.wParam = 0; GnMsg.lParam = 0; GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg); ImmUnlockIMC(hIMC); return TRUE;}/**********************************************************************//* *//* GenerateMessage() *//* *//* Update the transrate key buffer. *//* *//**********************************************************************/BOOL GenerateMessage(HIMC hIMC, LPDWORD lpdwTransKey,LPGENEMSG lpGeneMsg){ LPINPUTCONTEXT lpIMC; if( (lpIMC = ImmLockIMC(hIMC)) == NULL ) return FALSE; if (lpdwTransKey){ ImmUnlockIMC(hIMC); return GenerateMessageToTransKey(lpdwTransKey,lpGeneMsg); } if (IsWindow(lpIMC->hWnd)) { LPDWORD lpdw; if (!(lpIMC->hMsgBuf = ImmReSizeIMCC(lpIMC->hMsgBuf, sizeof(DWORD) * (lpIMC->dwNumMsgBuf +1) * 3))) return FALSE; if (!(lpdw = (LPDWORD)ImmLockIMCC(lpIMC->hMsgBuf))) return FALSE; lpdw += (lpIMC->dwNumMsgBuf) * 3; *((LPGENEMSG)lpdw) = *lpGeneMsg; ImmUnlockIMCC(lpIMC->hMsgBuf); lpIMC->dwNumMsgBuf++; ImmGenerateMessage(hIMC); } ImmUnlockIMC(hIMC); return TRUE;}/**********************************************************************//* GenerateMessageToTransKey() *//* *//* Update the transrate key buffer. *//**********************************************************************/BOOL GenerateMessageToTransKey(LPDWORD lpdwTransKey,LPGENEMSG lpGeneMsg){ LPDWORD lpdwTemp; uNumTransKey++; if (uNumTransKey >= (UINT)*lpdwTransKey) { fOverTransKey = TRUE; return FALSE; } lpdwTemp = (LPDWORD)lpdwTransKey + 1 + (uNumTransKey - 1)*3; *(lpdwTemp++) = lpGeneMsg->msg; *(lpdwTemp++) = lpGeneMsg->wParam; *(lpdwTemp++) = lpGeneMsg->lParam; return TRUE;} Ime应用有2种:half-aware (halfime.h)full-aware (fullime.h)请在帮助中搜索以上词 主要是UINT WINAPI ImeToAsciiEx (UINT uVKey,UINT uScanCode,CONST LPBYTE lpbKeyState,LPDWORD lpdwTransKey,UINT fuState,HIMC hIMC)这个函数的lpdwTransKey这个结构里面添消息。 如何动态添加菜单项 想请教一个封装的问题 把窗体封装在DLL里 PVOID m_pVoid 指向一个地址,我要将这个地址里的内容的前三个二进制位取反(0和1互换),怎么实现? 下列语句到底出错在哪儿啊!谢谢 TCP连接了,是否一直保持连接呢? 窗口叠加时,顶层窗口得不到鼠标的输入焦点 MFC ODBC 5道题,500分(4)如何获得当前记录号 关于API函数 [求助]关于网络下载图片jpg并保存为hbitmap 谁做过网络上图像的传输 使用VS2005安装部署文件,卸载的时候进度条停止不动,怎么回事 关于CreateDIBSection第四个参数的问题?
http://download.csdn.net/detail/schlafenhamster/1690580
怎么样的编码转什么汉字我不关心。我只要“a”转成“我的输入法”。
我想问:在输入法函数ImeToAsciiEx中怎么样把“a”转换成“我的输入法”,然后还要在那些函数中做什么处理,最后怎么把“我的输入法”传到应用程序的 ?请高手给我实现的代码
我的CMyEdit只是为了输出,移植到目标机就是你的输出窗口。
其次这是我的提问:
在输入法中 如果我要把用户输入的“a”转换成“我的输入法”具体在ImeToAsciiEx函数要做什么,还要在哪些函数中做什么处理,最后怎么把“我的输入法”传到应用程序的 ?请高手给我实现的代码。
http://download.csdn.net/detail/schlafenhamster/1690580
同求答案。
windows的输入法一直都是有问题的。chrome浏览器最出的几个比较大的BUG里始终不离输入法的。
用五笔打字的朋友都知道。计算机有点卡时,打字再快一些。很容易把系统打死的。
处理GCS_RESULTSTR命令,当用户使用输入法选定某一个候选字后,会发送WM_IME_COMPOSITION消息,携带GCS_RESULTSTR命令,此时可以使用ImmGetCompositionStringW函数获取用户选择的候选字的字符串”搜索“IME应用“
能不能在详细点。。
在自由拼音里面:
GnMsg.msg = WM_IME_STARTCOMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = 0;
GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg); GnMsg.msg = WM_IME_COMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = GCS_COMPSTR;
GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
GnMsg.msg = WM_IME_ENDCOMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = 0;
GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
IME我不知道怎么调试。3次消息 的时候参数有什么不同
lpdwCurTransKey这个参数貌似是ImeToAsciiEx传下来的。
还有。
是不发送WM_IME_COMPOSITION 消息的时候就携带转换后的汉字。但是系统不会发送到应用程序。而在WM_IME_ENDCOMPOSITION;之后就会发送汉字到应用程序
{
LPARAM lParam;
LPINPUTCONTEXT lpIMC;
BOOL fOpen; DebugLog(1,(DebugLogFile,"ImeToAsciiEx\n")); lpdwCurTransKey = lpdwTransKey;
lParam = ((DWORD)uScanCode << 16) + 1L;
// Init uNumTransKey here.
uNumTransKey = 0; // if hIMC is NULL, this means DISABLE IME.
if (!hIMC)
return 0;
if (!(lpIMC = ImmLockIMC(hIMC)))
return 0;
fOpen = lpIMC->fOpen;
ImmUnlockIMC(hIMC); // The current status of IME is "closed".
if (!fOpen)
goto my_exit; if (uScanCode & 0x8000)
IMEKeyupHandler( hIMC, uVKey, lParam, lpbKeyState);
else
IMEKeydownHandler( hIMC, uVKey, lParam, lpbKeyState);
// Clear static value, no more generated message!
lpdwCurTransKey = NULL;my_exit: // If trans key buffer that is allocated by USER.EXE full up,
// the return value is the negative number.
if (fOverTransKey)
{
return (int)uNumTransKey;
} return (int)uNumTransKey;
}BOOL CharHandler(
HIMC hIMC,
WORD wParam,
LONG lParam)
{
LPINPUTCONTEXT lpIMC;
LPCOMPOSITIONSTRING lpCompStr;
LPCANDIDATEINFO lpCandInfo;
DWORD dwStrLen;
GENEMSG GnMsg;
LPTSTR lpConvStr; lpIMC = ImmLockIMC(hIMC);
lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
dwStrLen = lpCompStr->dwCompStrLen; if (!dwStrLen)
{
lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
ClearCompStr(lpCompStr);
ClearCandidate(lpCandInfo);
ImmUnlockIMCC(lpIMC->hCandInfo); GnMsg.msg = WM_IME_STARTCOMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = 0;
GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg); if(wParam == _T('#') ) {
ImmUnlockIMCC(lpIMC->hCompStr);
ImmUnlockIMC(hIMC);
return RepeatPreResult(hIMC);
} if( (wParam < _T('a') || wParam > _T('z')) &&
(wParam < _T('A') || wParam > _T('Z')) &&
(wParam < _T('0') || wParam > _T('9')) ){
ImmUnlockIMCC(lpIMC->hCompStr);
ImmUnlockIMC(hIMC);
return GeneratePunct(hIMC,wParam);
} if( wParam == _T('i') ) {
LPTSTR lpStr; wConversionMode |= CONVERSION_MODE_I; lpStr = GETLPCOMPSTR(lpCompStr);
*lpStr = (TCHAR)wParam;
*(lpStr+1) = _T('\0');
lpCompStr->dwCompStrLen = _tcslen(lpStr); lpStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPaintCompStr;
_tcscpy(lpStr,IMODEL); GnMsg.msg = WM_IME_COMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = GCS_COMPSTR;
GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
goto my_exit;
}
if( wParam == _T('u') ) {
LPTSTR lpStr; wConversionMode |= CONVERSION_MODE_U; lpStr = GETLPCOMPSTR(lpCompStr);
*lpStr = (TCHAR)wParam;
*(lpStr+1) = _T('\0');
lpCompStr->dwCompStrLen = _tcslen(lpStr); lpStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPaintCompStr;
_tcscpy(lpStr,UMODEL); GnMsg.msg = WM_IME_COMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = GCS_COMPSTR;
GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
goto my_exit;
}
if( wParam == _T('v') ) {
LPTSTR lpStr; wConversionMode |= CONVERSION_MODE_V; lpStr = GETLPCOMPSTR(lpCompStr);
*lpStr = (TCHAR)wParam;
*(lpStr+1) = _T('\0');
lpCompStr->dwCompStrLen = _tcslen(lpStr); lpStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPaintCompStr;
_tcscpy(lpStr,VMODEL); GnMsg.msg = WM_IME_COMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = GCS_COMPSTR;
GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
goto my_exit;
}
} if(wConversionMode & CONVERSION_MODE_PHRASETOCHAR) {
if( CharHandlePhToCh(hIMC,wParam,lParam) ) goto my_exit;
}
else if(wConversionMode & CONVERSION_MODE_I) {
if( CharHandleI(hIMC,wParam,lParam) ) goto my_exit;
}
else if(wConversionMode & CONVERSION_MODE_U) {
if( CharHandleU(hIMC,wParam,lParam) ) goto my_exit;
}
else if(wConversionMode & CONVERSION_MODE_V) {
if( CharHandleV(hIMC,wParam,lParam) ) goto my_exit;
}
else{
if( CharHandleNormal(hIMC,wParam,lParam) ) goto my_exit;
} if( wParam >= _T('!') && wParam <= _T('~') && lpCompStr->dwCompStrLen == 0) {
lpConvStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szConvCompStr;
if(wConversionSet & CONVERSION_SET_FULLSHAPE) {
BYTE bChar[4];
bChar[0] = 0xA3;
bChar[1] = (BYTE)wParam + 0x80;
bChar[2] = 0;
bChar[3] = 0;
memcpy((LPBYTE)lpConvStr,bChar,4);
}
else{
*lpConvStr = (TCHAR)wParam;
*(lpConvStr+1) = _T('\0');
}
MakeResultString(hIMC,TRUE);
}my_exit:
ImmUnlockIMCC(lpIMC->hCompStr);
ImmUnlockIMC(hIMC);
return TRUE;
}
BOOL MakeResultString( HIMC hIMC,BOOL fFlag)
{
GENEMSG GnMsg;
LPCOMPOSITIONSTRING lpCompStr;
LPINPUTCONTEXT lpIMC;
LPTSTR lpConvStr,lpPreResultStr;
LPCANDIDATEINFO lpCandInfo;
LPCANDIDATELIST lpCandList;
/*
if (!IsCompStr(hIMC))
return FALSE;
*/
wConversionMode = 0; lpIMC = ImmLockIMC(hIMC);
lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]); if(fFlag) {
lpConvStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szConvCompStr;
lpPreResultStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPreResultStr;
_tcscpy(GETLPRESULTSTR(lpCompStr),lpConvStr);
_tcscpy(lpPreResultStr,lpConvStr);
lpCompStr->dwResultStrLen = _tcslen(lpConvStr);
}
else{
*GETLPRESULTSTR(lpCompStr) = _T('\0');
lpCompStr->dwResultStrLen = 0;
} lpCandList->dwCount = 0;
lpCompStr->dwCompStrLen = 0; _tcscpy(GETLPCANDSTR(lpCandList,0),_T(""));
_tcscpy(GETLPCANDSTR(lpCandList,1),_T(""));
ImmUnlockIMCC(lpIMC->hCompStr);
ImmUnlockIMCC(lpIMC->hCandInfo);
GnMsg.msg = WM_IME_COMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = GCS_RESULTSTR;
GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
GnMsg.msg = WM_IME_ENDCOMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = 0;
GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
ImmUnlockIMC(hIMC);
return TRUE;
}/**********************************************************************/
/* */
/* GenerateMessage() */
/* */
/* Update the transrate key buffer. */
/* */
/**********************************************************************/
BOOL GenerateMessage(HIMC hIMC, LPDWORD lpdwTransKey,LPGENEMSG lpGeneMsg)
{
LPINPUTCONTEXT lpIMC; if( (lpIMC = ImmLockIMC(hIMC)) == NULL ) return FALSE;
if (lpdwTransKey){
ImmUnlockIMC(hIMC);
return GenerateMessageToTransKey(lpdwTransKey,lpGeneMsg);
}
if (IsWindow(lpIMC->hWnd))
{
LPDWORD lpdw;
if (!(lpIMC->hMsgBuf = ImmReSizeIMCC(lpIMC->hMsgBuf,
sizeof(DWORD) * (lpIMC->dwNumMsgBuf +1) * 3)))
return FALSE;
if (!(lpdw = (LPDWORD)ImmLockIMCC(lpIMC->hMsgBuf)))
return FALSE;
lpdw += (lpIMC->dwNumMsgBuf) * 3;
*((LPGENEMSG)lpdw) = *lpGeneMsg;
ImmUnlockIMCC(lpIMC->hMsgBuf);
lpIMC->dwNumMsgBuf++;
ImmGenerateMessage(hIMC);
}
ImmUnlockIMC(hIMC);
return TRUE;
}/**********************************************************************/
/* GenerateMessageToTransKey() */
/* */
/* Update the transrate key buffer. */
/**********************************************************************/
BOOL GenerateMessageToTransKey(LPDWORD lpdwTransKey,LPGENEMSG lpGeneMsg)
{
LPDWORD lpdwTemp;
uNumTransKey++;
if (uNumTransKey >= (UINT)*lpdwTransKey)
{
fOverTransKey = TRUE;
return FALSE;
}
lpdwTemp = (LPDWORD)lpdwTransKey + 1 + (uNumTransKey - 1)*3;
*(lpdwTemp++) = lpGeneMsg->msg;
*(lpdwTemp++) = lpGeneMsg->wParam;
*(lpdwTemp++) = lpGeneMsg->lParam;
return TRUE;
}
half-aware (halfime.h)
full-aware (fullime.h)
请在帮助中搜索以上词