处理windows的IME
输入法工作原理
参考文档:
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/