2018年01月23日

WindowsのSDL2でIMEの変換候補リストを取得するコード

WindowsのSDL2のIMEヘルパーが変換候補リストを表示してくれないので、IMEを叩いて変換候補リストを取得してみました。


void getCandidateList(SDL_Window* window, std::vector<std::wstring>& candidate_list)
{
SDL_SysWMinfo window_info;
SDL_VERSION(&window_info.version);
SDL_GetWindowWMInfo(window, &window_info);
HWND hwnd = window_info.info.win.window;
HIMC himc = ImmGetContext(hwnd);

DWORD dwsize = ImmGetCandidateList(himc, 0, nullptr, 0);
if (dwsize == 0) return;

HGLOBAL hmem = (LPCANDIDATELIST)GlobalAlloc(GHND, dwsize);
if (hmem == NULL) return;

LPCANDIDATELIST lpcdl = (LPCANDIDATELIST)GlobalLock(hmem);
ImmGetCandidateList(himc, 0, lpcdl, dwsize);

candidate_list.resize(lpcdl->dwCount);
for (int i = 0; i < lpcdl->dwCount; ++i)
candidate_list[i] = (wchar_t*)((char*)lpcdl + lpcdl->dwOffset[i]);

GlobalFree(hmem);
}


コードは下記のサイトを参考にさせて頂きました。
http://www.kumei.ne.jp/c_lang/sdk3/sdk_282.htm

参考サイトのコードはそのままだと自動構文解析エラーが出ていたので、色々と修正してあります。

↓は応用例。

sdl_candidate_list.gif

OSはWindows10Home64bit、MSVCのエディタ文字コードはUTF-8(BOMなし)で動作確認しています。

入力コンテキストの作成と削除やIMEのオン・オフの切り替えはSDL2がやってくれるので、これらの処理を自分で書く必要はありません。SDL_StartTextInput()を呼び出した後に上記のコードを実行すれば変換候補リストが取得できます。

IMMの導入方法は、SDL2のIME機能が使えて且つSDL2をスタティックリンクしているなら、imm32.libはすでに追加しているはずなので、この場合は何もする必要はありません。
dllについてはよく分かりませんが、リンクエラーが出るならimm32.libを追加すればよいかと思います。


以上です。

(*´Д`*)ああああありがとうございました。
posted by gency at 02:11| Comment(0) | 3DProgramming
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: