中止 Windows IME 组合/清除组合字符串
aborting Windows IME composition / clearing composition string
我在 Windows 上中止 IME 合成时遇到问题。
我正在处理 WM_IME_STARTCOMPOSITION 并定位我的候选人 window 和 WM_IME_COMPOSITION,因为我按一个键开始作曲,正如您所期望的那样。然后我在最后处理 WM_IME_ENDCOMPOSITION,正常用例没问题。
但是,我的问题是当我在应用程序内部更改焦点时。我没有收到 WM_IME_ENDCOMPOSITION 所以我必须手动处理这种情况。我正在做的是:
ImmNotifyIME( himc, NI_COMPOSITIONSTR, CPS_CANCEL, 0 );
ImmNotifyIME( himc, NI_CLOSECANDIDATE, 0, 0 );
候选列表正确消失,但作文字符串未清除。如果我随后使用 GCS_COMPSTR 调用 ImmGetCompositionString,它仍然存在。因此,如果我返回焦点,接收 WM_IME_STARTCOMPOSITION 和第一个 WM_IME_COMPOSITION - 我最终会继承以前的组合字符串,这是我不想要的。我想重新开始。
ImmSetCompositionString() 看起来也行得通,但我不知道如何使用它来清除字符串。
有人有什么建议吗? MSDN 似乎建议调用 ImmNotifyIME() 可以完成这项工作,但我一定遗漏了一些东西。
你可以这样清除构图:
ImmSetCompositionStringW(himc, SCS_SETSTR, L"", sizeof(wchar_t), L"", sizeof(wchar_t));
此外,在我的应用程序中,当输入失去焦点时,我释放输入上下文:
ImmReleaseContext(hwnd, himc);
并在获得焦点时再次获取它:
ImmGetContext(hwnd);
我在 Windows 上中止 IME 合成时遇到问题。
我正在处理 WM_IME_STARTCOMPOSITION 并定位我的候选人 window 和 WM_IME_COMPOSITION,因为我按一个键开始作曲,正如您所期望的那样。然后我在最后处理 WM_IME_ENDCOMPOSITION,正常用例没问题。
但是,我的问题是当我在应用程序内部更改焦点时。我没有收到 WM_IME_ENDCOMPOSITION 所以我必须手动处理这种情况。我正在做的是:
ImmNotifyIME( himc, NI_COMPOSITIONSTR, CPS_CANCEL, 0 );
ImmNotifyIME( himc, NI_CLOSECANDIDATE, 0, 0 );
候选列表正确消失,但作文字符串未清除。如果我随后使用 GCS_COMPSTR 调用 ImmGetCompositionString,它仍然存在。因此,如果我返回焦点,接收 WM_IME_STARTCOMPOSITION 和第一个 WM_IME_COMPOSITION - 我最终会继承以前的组合字符串,这是我不想要的。我想重新开始。
ImmSetCompositionString() 看起来也行得通,但我不知道如何使用它来清除字符串。
有人有什么建议吗? MSDN 似乎建议调用 ImmNotifyIME() 可以完成这项工作,但我一定遗漏了一些东西。
你可以这样清除构图:
ImmSetCompositionStringW(himc, SCS_SETSTR, L"", sizeof(wchar_t), L"", sizeof(wchar_t));
此外,在我的应用程序中,当输入失去焦点时,我释放输入上下文:
ImmReleaseContext(hwnd, himc);
并在获得焦点时再次获取它:
ImmGetContext(hwnd);