处理windows的IME

2021-06-27  本文已影响0人  行走的代码

输入法工作原理

参考文档:
https://blog.csdn.net/shuilan0066/article/details/6883629
https://blog.csdn.net/new_smile/article/details/51097366

IME消息定义

参考文档:https://blog.csdn.net/danxuezx/article/details/4509965

cef中关于IME的源码

窗口模式:代码在src\ui\base\ime目录下,win端可以查看imm32_manager.cc文件。
无窗口模式:cef提供的测试示例中,有监听IME事件,处理输入法窗口位置、光标等的方法,可以参照这个例子实现修改。示例代码路径:src\cef\tests\cefclient\browser\osr_window_win.cc

LRESULT CALLBACK OsrWindowWin::OsrWndProc(HWND hWnd,
                                          UINT message,
                                          WPARAM wParam,
                                          LPARAM lParam) {
  CEF_REQUIRE_UI_THREAD();

  OsrWindowWin* self = GetUserDataPtr<OsrWindowWin*>(hWnd);
  if (!self)
    return DefWindowProc(hWnd, message, wParam, lParam);

  // We want to handle IME events before the OS does any default handling.
  switch (message) {
    case WM_IME_SETCONTEXT:
      self->OnIMESetContext(message, wParam, lParam);
      return 0;
    case WM_IME_STARTCOMPOSITION:
      self->OnIMEStartComposition();
      return 0;
    case WM_IME_COMPOSITION:
      self->OnIMEComposition(message, wParam, lParam);
      return 0;
    case WM_IME_ENDCOMPOSITION:
      self->OnIMECancelCompositionEvent();
      // Let WTL call::DefWindowProc() and release its resources.
      break;

一些接口说明

ImmGetContext:获取输入窗口对应的输入法环境上下文。
中文输入法设置位置注意事项:
如果用户打开 TSF and CUAS:通过::ImmSetCandidateWindow()的CFS_CANDIDATEPOS属性,设置输入位置;
如果关闭:通过SetCaretPos设置位置。(来自cef源码注释)

一些问题反馈

问题1:Osr模式下输入法位置不对
这个问题反馈的人很多,cef很多版本都存在这个问题,例如下面这个官网帖子:https://bitbucket.org/chromiumembedded/cef/issues/1675/inline-ime-support-nstextinput-protocol-in
一个靠谱的解决方案帖子:https://www.shuzhiduo.com/A/gAJG9YQbdZ/
很疑惑,这个问题存在了很久,为什么cef源码一直没有修复?

问题2:IME 候选窗口遮挡文本
还没有遇到这个问题,只是看到一个帖子,顺便记录下来。
https://sourceforge.net/p/scintilla/bugs/2120/

上一篇下一篇

猜你喜欢

热点阅读