我正在尝试将Hiaragana字符转换为候选列表(汉字)。看起来应该可以通过使用输入法管理器功能来实现,但是它没有按我预期的那样工作。
我安装了日语语言包,并且能够在文本编辑器中打开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://docs.microsoft.com/en-us/windows/desktop/api/Imm/nf-imm-immgetcandidatelistcounta
看备注部分。
“应用程序通常会响应IMN_OPENCANDIDATE或IMN_CHANGECANDIDATE命令来调用此函数。”
当消息循环类型为“ IMN_OPENCANDIDATE”或“ IMN_CHANGECANDIDATE”时,可以使用immgetcandidatelistcount函数。