ImmGetCandidateList与OS

时间:2019-08-02 09:49:18

标签: windows ime

我想为中文实现我自己的ime候选人列表。

Windows 7 中,我没有问题。但是更新到 Windows 10 后,我没有候选列表或虚假的候选列表。

通过添加以下行: “ lParam&=〜ISC_SHOWUICANDIDATEWINDOW”,我得到了更好的候选结果。

对于某些输入,候选人是正确的:“ wo hen hao”->“你好,你好吗” 一些输入没有提供任何候选:“ gege”->兄弟

通常,我收到的求职者与操作系统给出的输入完全不同,例如在注释中给出的相同输入。

以下代码在Win7中工作正常,但在Win10中工作不正确。


LRESULT CALLBACK MyCallbackProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_IME_SETCONTEXT:
        if ((lParam & ISC_SHOWUICANDIDATEWINDOW) > 0)
        {




      lParam &= ~ISC_SHOWUICANDIDATEWINDOW;
      lParam &= ~2;
      lParam &= ~4;
      lParam &= ~8;
      //lParam &= ~ISC_SHOWUICOMPOSITIONWINDOW;

      ImmIsUIMessage(hWnd, msg, wParam, lParam);
      DefWindowProc(hWnd, msg, wParam, lParam);
      //
        }



        break;
    case WM_APP:
        {
            SendMessage(hList, LB_RESETCONTENT, 0, 0);
            HIMC hImc = ImmGetContext(hWnd);
            if (hImc)
            {
                DWORD dwSize = ImmGetCandidateListW(hImc, 0, NULL, 0);
                if (dwSize)
                {
                    HGLOBAL hMem = GlobalAlloc(GHND, dwSize);
                    if (hMem)
                    {
                        LPCANDIDATELIST lpCandidateList = (LPCANDIDATELIST)GlobalLock(hMem);
                        ImmGetCandidateListW(hImc, 0, lpCandidateList, dwSize);
                        for (DWORD i = 0; i < lpCandidateList->dwCount; ++i)
                        {
                            SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)((LPBYTE)lpCandidateList + lpCandidateList->dwOffset[i]));
                        }
                        GlobalFree(hMem);
                    }
                }
                ImmReleaseContext(hWnd, hImc);
            }
        }
        break;
    case WM_IME_NOTIFY:

        switch (wParam)
        {
        case IMN_OPENCANDIDATE:
      SendMessage(hWnd, WM_APP, 0, 0);
        case IMN_CHANGECANDIDATE:
            SendMessage(hWnd, WM_APP, 0, 0);
            break;
        case IMN_CLOSESTATUSWINDOW:
        case IMN_CLOSECANDIDATE:
            SendMessage(hList, LB_RESETCONTENT, 0, 0);
            break;
        }
        break;
    default:
        break;
    }
    return CallWindowProc(DefaultEditWndProc, hWnd, msg, wParam, lParam);
}

0 个答案:

没有答案