我想为中文实现我自己的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);
}