c++ - 输入法管理器函数 - 平假名到汉字候选列表 c++ 转换的正确调用顺序

标签 c++ winapi ime

我正在尝试将平假名字符转换为候选列表(汉字)。看起来应该可以通过使用输入法管理器功能实现,但它并没有像我预期的那样工作。
我安装了日语语言包,并且能够在文本编辑器中打开 IME,因此应该启用某些功能。

在 src 中我们有这样的东西:

HIMC context = ImmCreateContext();//non-NULL result
bool result = ImmSetOpenStatus(context, true);//result == true
std::wstring wstr = L"こいび";//Hiragana string for conversion
result = ImmSetConversionStatus(context, IME_CMODE_JAPANESE, IME_SMODE_NONE);//result == true
result = ImmSetCompositionString(context, SCS_SETSTR, (LPVOID)wstr.c_str(), wstr.length(), NULL, 0);//result == true
DWORD listCount = 0;
DWORD lpdResult = 0;
lpdResult = ImmGetCandidateListCount(context, &listCount);//listCount == 0, lpdResult  == 144

看起来它以某种方式工作,但我总是得到类似的结果(我检查了它的标准字母、较短的 JPN 字符串并通过创建 std::string + 转换为 wstring)。
不幸的是,我没有找到与之相关的示例,所以也许我没有调用某些东西或者我以错误的顺序调用了某些东西。
MS documentation包含的细节不多,所以我不确定出了什么问题。

最佳答案

Imm 函数必须在窗口消息循环中使用。

例如, https://learn.microsoft.com/en-us/windows/desktop/api/Imm/nf-imm-immgetcandidatelistcounta 看备注部分。

“应用程序通常调用此函数以响应 IMN_OPENCANDIDATE 或 IMN_CHANGECANDIDATE 命令。”

当消息循环类型为“IMN_OPENCANDIDATE”或“IMN_CHANGECANDIDATE”时,可以使用immgetcandidatelistcount函数。

关于c++ - 输入法管理器函数 - 平假名到汉字候选列表 c++ 转换的正确调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41428585/

相关文章:

c++ - 在应用程序中禁用 Microsoft IME

c++ - 运行 WinForm 的函数 "In Background"(VS2010 c++)

c++ - 在 C++ 中检查零或非规范化数字

c++ - 导出符号是什么意思?

c++ - LWG2349 会有什么影响?

c++ - SendMessage 无法将自定义消息发送到主窗口

c++ - 不能通过回调永久改变类的状态

java - 如何让 Hadoop 命令行脚本在 Win32 上运行?

javascript - 如何让 oninput() 只在输入汉字而不是 IME 击键时触发?

android - Android 键盘上的 DONE 键