【问题标题】:aborting Windows IME composition / clearing composition string中止 Windows IME 组合/清除组合字符串
【发布时间】:2017-05-13 23:10:04
【问题描述】:

在 Windows 上中止 IME 合成时遇到问题。

我正在处理 WM_IME_STARTCOMPOSITION 并定位我的候选窗口,以及 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() 的调用可以完成这项工作,但我一定遗漏了一些东西。

【问题讨论】:

    标签: windows ime


    【解决方案1】:

    你可以用这个来清除构图:

    ImmSetCompositionStringW(himc, SCS_SETSTR, L"", sizeof(wchar_t), L"", sizeof(wchar_t));
    

    此外,在我的应用程序中,当输入失去焦点时,我会释放输入上下文:

    ImmReleaseContext(hwnd, himc);
    

    在获得焦点时再次获取它:

    ImmGetContext(hwnd);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多