Windows 10下ImmNotifyIME调用失败及候选框隐藏问题咨询
关于Windows 10 IMM API调用失败的问题
我在Windows 10上开发一款使用IME合成功能的程序,程序在特定线程中通过DefWindowProc处理所有WM_IME_消息,另一个线程负责检查IMM上下文。
输入法位置设置的代码差异
当我需要更改输入法位置时,以下代码可以正常工作:
HWND idefhwnd = fpImmGetDefaultIMEWnd (hwnd); ::SendMessageW (idefhwnd, WM_IME_CONTROL, IMC_SETCOMPOSITIONWINDOW, reinterpret_cast<LPARAM>(reinterpret_cast<void*>(&cpf)));
但以下代码执行失败:
HIMC hImc = fpImmGetContext (hwnd); fpImmSetCompositionWindow (hImc, &cpf); fpImmReleaseContext (hwnd, hImc);
核心疑问
我想了解导致fpImmNotifyIME调用失败的场景,以及是否有其他方法可以临时隐藏候选框。
补充详情
为兼容旧编译器,我通过动态加载Imm32.dll的方式调用函数:
hModImm32 = ::GetModuleHandleW (L"Imm32.dll"); fun = ::GetProcAddress (hModImm32, funcname);
部分IMM函数可正常工作,比如使用ImmAssociateContextEx临时禁用IME的功能就运行正常:
using iace_t = decltype(ImmAssociateContextEx); iace_t* fpImmAssociateContextEx = mcl_get_immfunc<iace_t>("ImmAssociateContextEx"); if (!fpImmAssociateContextEx) return false; fpImmAssociateContextEx (hwnd, NULL, IACE_CHILDREN);
但我发现该方法无法在输入过程中关闭候选框,因此尝试在调用fpImmAssociateContextEx前通过以下代码通知输入法关闭窗口:
HIMC himc = fpImmGetContext (hwnd); // himc != nullptr fpImmNotifyIME ( himc, NI_COMPOSITIONSTR, CPS_CANCEL, 0 ); fpImmNotifyIME ( himc, NI_CLOSECANDIDATE, 0, 0 );
所有fpImmNotifyIME调用均返回FALSE且无任何效果。
内容的提问来源于stack exchange,提问作者依奈ちゃん
相关产品推荐
相关产品推荐

