本帖最后由 VisualEleven 于 2012-09-03 10:38:29 编辑

解决方案 »

  1.   

    下载我的‘MyFreePy.rar’
    http://download.csdn.net/detail/schlafenhamster/1690580
      

  2.   

    下了你的程序看了。不是我要的。这个不是输入法是个应用程序。程序里定义了个CMyEdit  。里面处理键盘事件在调用KeydownHandler里面直接看空格键处理MakeResultString。然后SendMessage(g_DlgWnd,WM_HZTEXT,0,0);显示结果了吧。这个不是输入法的机制。中间拼音转换成汉字好象是用的自由拼音的方法。
    怎么样的编码转什么汉字我不关心。我只要“a”转成“我的输入法”。
    我想问:在输入法函数ImeToAsciiEx中怎么样把“a”转换成“我的输入法”,然后还要在那些函数中做什么处理,最后怎么把“我的输入法”传到应用程序的 ?请高手给我实现的代码
      

  3.   

    你不是要"把拼音转换成汉字"的过程吗?
    我的CMyEdit只是为了输出,移植到目标机就是你的输出窗口。
      

  4.   

    首先谢谢你的回答
    其次这是我的提问:
      在输入法中 如果我要把用户输入的“a”转换成“我的输入法”具体在ImeToAsciiEx函数要做什么,还要在哪些函数中做什么处理,最后怎么把“我的输入法”传到应用程序的 ?请高手给我实现的代码。
      

  5.   

    刚刚又看了自由拼音。觉得最终调用的是ImmGenerateMessage(hIMC);这个函数。转换后的汉字就保存HICM这个结构中。如果我在ImeToAsciiEx拦截A键直接修改HIMC再调用ImmGenerateMessage  不知道能不能直接输出汉字?
      

  6.   

    回复于:2012-09-03 09:15:06下载我的‘MyFreePy.rar’
    http://download.csdn.net/detail/schlafenhamster/1690580 
     
      

  7.   

    spy++看了一下...似乎还是WM_CHAR,不过输入法产生的都是扫描码为0的,汉字也是一个WM_CHAR表示的...只是看了消息,不清楚过程是怎么处理的...
      

  8.   

    没错是WM_CHAR。2楼的程序加个SENDMESSAGE 再加个IME框架他也可以 是个外挂式的输入法。我要的是IME是怎么发送出去汉字的
      

  9.   

    自由拼音输入法源码看这头痛。在空格键处理最终调用了ImmGenerateMessage(hIMC);  其间发送了WM_IME_STARTCOMPOSITION,WM_IME_COMPOSITION,和WM_IME_ENDCOMPOSITION,3个消息  都是调用ImmGenerateMessage,HIMC里面存有消息内容。和汉字内容
      

  10.   

    好像涉及到码表的问题。以前在win98下系统自带的输入法有个后缀为mb的文件。
      

  11.   

    我记得是GetChar单字节是ASCII的。双字节是unicode的。这并不是答案哦。
    同求答案。
      

  12.   


    windows的输入法一直都是有问题的。chrome浏览器最出的几个比较大的BUG里始终不离输入法的。
    用五笔打字的朋友都知道。计算机有点卡时,打字再快一些。很容易把系统打死的。
      

  13.   

    “需要处理WM_IME_COMPOSITION消息
    处理GCS_RESULTSTR命令,当用户使用输入法选定某一个候选字后,会发送WM_IME_COMPOSITION消息,携带GCS_RESULTSTR命令,此时可以使用ImmGetCompositionStringW函数获取用户选择的候选字的字符串”搜索“IME应用“
      

  14.   


    能不能在详细点。。
    在自由拼音里面:
            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);
      

  15.   

    GenerateMessage  最终是调用ImmGenerateMessage(hIMC);
    IME我不知道怎么调试。3次消息 的时候参数有什么不同
    lpdwCurTransKey这个参数貌似是ImeToAsciiEx传下来的。
    还有。
     是不发送WM_IME_COMPOSITION  消息的时候就携带转换后的汉字。但是系统不会发送到应用程序。而在WM_IME_ENDCOMPOSITION;之后就会发送汉字到应用程序
      

  16.   

    我把自由拼音这几个函数放这里: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;
    }
      

  17.   

    Ime应用有2种:
    half-aware (halfime.h)
    full-aware (fullime.h)
    请在帮助中搜索以上词
      

  18.   

    主要是UINT WINAPI ImeToAsciiEx (UINT uVKey,UINT uScanCode,CONST LPBYTE lpbKeyState,LPDWORD lpdwTransKey,UINT fuState,HIMC hIMC)这个函数的lpdwTransKey这个结构里面添消息。