フリガナ取得 その(2)



前回、ExcelのCOMを利用して超ズボラシステムでフリガナを取得しました。
しかし、
 ・パフォーマンス悪くね?('A`)
 ・フリガナの為にエクセル買うの?

という問題が露呈しました。今回はこの続きです。


Imm32.dll

 Wordなんかで文章を書いていて「再変換」というのメニューが有りますね。
アレをやると漢字から、ひらがなになりますね。コレを使いましょう。
上記のDLLはwindowsなら標準でついています。(おそらく、多分)
ライセンス料もいらないですし(windowsのライセンスは要りますよ)、初期化は一回で済みますしね。


関数検索

 Imm32.dllがIME制御であることは間違いないでしょう。となると、どういう関数が
ふりがな取得に必要なんでしょうか。( -人-).。oO(・・・・・・)
とりあえず、MSDNサイトでしらべてみま しょう。

MSDNライブラリを持っている人が近くにいたらそっちのほうが早いかもしれません。
散々探し回ったです。こ んなところにあります。


さて、ふりがな取得はどの関数なんでしょう。多分、「取得」だからGet関係でしょう。
ImmGet〜あたりを見ていくと、 ImmGetConversionListという関数があります。
これがどうもクサイですね。見てみると…、
GCL_REVERSECONVERSION ソース文字列は、 変換結果です。
ソース文字列を逆 変換して得られた読み文字列が指定したバッファにコピーされます。

ふむ、となるとあとはこの関数の使い方だけですねぇ、サンプルでもあればいいんですが…。
おっと、検索してみるもんですね、FAQに 載っていますよ。
void CImetestDlg::OnButton1() 
{
HIMC hIMC;
HKL hKL;
DWORD dwSize;
hIMC = ImmGetContext(m_hWnd);
hKL = GetKeyboardLayout(0);
LPCANDIDATELIST lpCand;

dwSize = ImmGetConversionList(hKL, hIMC, "明日", NULL, 0, GCL_REVERSECONVERSION);
lpCand = (LPCANDIDATELIST)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);
ImmGetConversionList(hKL, hIMC, "明日", lpCand, dwSize, GCL_REVERSECONVERSION);
for (unsigned int i = 0; i< lpCand->dwCount; i++)
{
TRACE("%s", (LPBYTE)lpCand + lpCand->dwOffset[i]);
}
ImmReleaseContext(m_hWnd, hIMC);
HeapFree(GetProcessHeap(), 0, lpCand);
}

ええと、|д゚)カンサツ

  1. ハンドルを渡してコンテキスト取得
  2. キーボードレイアウト取得
  3. 5番目の引数を0で呼び出し、バッファサイズ取得
  4. GCL_REVERSECONVERSION を伴って呼び出す
  5. CANDIDATELIST に「候補数」と「変換結果」を返している
  6. 後片付け(諸々解放)

こんな感じですかね。

残作業

 このTipsは.NETなんで、このC++のサンプルはそのままではつかえませんね。
あまり長ったらしいのもアレなんで続きは次回。
残作業をまとめておきましょう。
こんなところでしょうか。



ブラウザのBACKでお戻り下さい