非公開API | |
日本のTodayアプリの夜明けかと思った。
そんな瞬間だった。
Todayアプリは日本語が使えない。たぶんこれが常識でした。もしかすると違ったのかもしれませんが。
少なくとも、設定画面で日本語が使えないので別アプリを呼び出したり、Todayの入力エリアに日本語が入力できないので別アプリを呼び出して入力エリアにかぶせて表示したり、そんな泥臭いことまみれでした。
いろいろ調べてたところTodayで日本語が入力できないことに関して言及している方がおられました。
ImmDisableIME(..
...プロセス内の1つのスレッドまたはすべてのスレッドの IME を無効にします。
関数自体は CE には対応してないん。
CE も同一の概念で作ってるのかなこの辺は。うーむ。
まいなす1000度の世界: ProgramCE
ここの記事ではこの関数はCEに対応していない。と書かれていますが、MSDNによるとそんなことはありませんでした。
Requirements
Windows Mobile Windows Mobile Version 5.0 and later
ImmDisableIME
しかしMSDNにはDisableするAPIしか掲載されておらず、VisualStudioのインテリセンスもDisableしか表示しません。EnableにするAPIは存在しないのかと思っていました。
が、しかし、WindowsCE系列のOSはほぼすべてのAPIがcoredll.dllに入っています。このDLLがエクスポートしている関数の一覧をid:ch3cooh393が作ってくれています。この一覧のなかにImmEnableIMEというのがありました。
しかし非公開APIなので使い方はわかりませんが、とりあえずGoogle検索をしたところ関数のプロトタイプは
BOOL WINAPI ImmEnableIME(DWORD)
であることまではわかりました。
あとはこのDWORDへ何を渡せばいいか。ですが、まぁ途中の経緯はすっ飛ばして、とりあえず0を渡せばOKです。
このAPIをDLL中で呼び出すとTodayのコンテキストで日本語入力をすることが可能になります。
C++から呼び出す場合はこんな感じですね
extern "C" BOOL ImmEnableIME(DWORD); BOOL DllMain(HANDLE hinstDLL, DWORD dwReason, LPVOID lpvReserved){ switch(dwReason){ case DLL_PROCESS_ATTACH: ImmEnableIME(0); break; ... 略 ... } }
このAPIは誰かが呼べばOKで呼んだ誰かはアンロードされても大丈夫です。なので誰かわからないけど呼んでくれる人が必要ですが、みんな呼べばいいと思います。
非公開APIなので今後変更される可能性は大いにありますし、もしかすると今後使えなくなるかもしれません。
追記:DLL_PROCESS_ATTACHでEnableすると日本語入力できないタイミングが発生することがあるようです。(詳しくはこのエントリのコメント欄参照)各自日本語入力が必要になったタイミングでEnableして終わったらDisableする実装のほうがお行儀が良いのかも知れません。
とりあえずこんな感じで。
情報ありがとうございます。
ImmEnableIME()試してみました。ただ、ImmEnableIME()を入れる場所
ですが、オプション画面を作成する直前にしてみました。
わたしだけかもしれませんが、DLL_PROCESS_ATTACHのタイミングだと
Today画面からオプション画面を呼出した後に、スタート-設定から
オプション画面を開くと日本語入力できないことがありました。
ご参考までに。
DLL_PROCESS_ATTACHのタイミングだとTodayのオプションから呼ばれたときに日本語が通らないのですか。なるほど、それは検証していませんでした。
各自入力が必要になったときに関数をコールしていらなくなったらDiableするような実装の方がいいかもですね。ありがとうございます。