IMEの制御 – プログラミング – Home

通知
すべてクリア

[解決済] IMEの制御


quoll
 quoll
(@quoll)
ゲスト
結合: 17年前
投稿: 8
Topic starter  

ケータイのような予測変換ソフトを作ろうとしてます。

ImmGetCompositionString関数を使って変換中の文字列を取得したいのですが、例えばメ
モ帳などの他のアプリの入力コンテキストがうまく取得できません。

キーフックを使って文字が入力されたらGetFoucs関数でウィンドウハンドルを取得して、
ImmGetContext関数で入力コンテキストを取得しようとやってみたのですが入力コンテキ
ストをうまく取得できませんでした。

そもそもキーフックを使うのは妥当では気がします(^^;

いい方法があればご教示お願いします。


引用未解決
トピックタグ
FUKU
 FUKU
(@FUKU)
ゲスト
結合: 17年前
投稿: 73
 

WH_GETMESSAGEを登録するグローバルフックDLLを作成し、
フックプロシージャ内で

if (pMsg->message == WM_IME_COMPOSITION) {
HIMC hImc = ::ImmGetContext(pMsg->hwnd);
::ImmGetCompositionString(hImc, GCS_COMPSTR,,,,);
//::ImmGetCompositionString(hImc, GCS_GCS_RESULTSTR,,,,);
::ImmReleaseContext(pMsg->hwnd, hImc);

// 取得した文字列をEXE側にコールバック
 ~~~
}

みたいな感じでどうでしょうか。


返信引用
quoll
 quoll
(@quoll)
ゲスト
結合: 17年前
投稿: 8
Topic starter  

FUKUさん回答ありがとうございます。

回答していただいた方法で入力された文字列を取得できたようですが、取得した文字列を
EXE側にコールバックする方法がわかりません。

試しに取得した文字列をMessageBoxで表示してみたのですが「あ」と入力したら「あマw」
などよくわからない文字列が表示されました。1文字目だけは正しいのですが、そのあと
に意味不明な文字列が付加されてしまいます。

予測変換機能以外の処理にも使いたいので、取得した文字列ではなくウィンドウハンドル
もしくは入力コンテキストをEXE側に送りたいのですが可能なのでしょうか?


返信引用
FUKU
 FUKU
(@FUKU)
ゲスト
結合: 17年前
投稿: 73
 

少し試してみたところ、
コールバック関数でHWNDやHIMCをEXE側に渡しても、
EXE側でのImmGetContext()/ImmGetCompositionString()
は何故か失敗してしまうようです。

代わりに、DLLで取得した文字列をWM_COPYDATAで
EXEに渡すとうまくいきました。

例えばメモ帳を開いて「ほげ」と書くとEXE側で
----------


ほg
ほげ
----------
という結果を受け取ります。

> 「あ」と入力したら「あマw」
については申し訳ないですが、quollさんのコードや
開発環境が分からないので何とも言えません^^;

尚こちらの環境は
VISTA(32bit) VS2005 SP1 VC++
テストコードは
EXE(ダイアログアプリMFC有り)/DLL(MFC無し)
共にマルチバイト文字セット/Releaseモードです。


返信引用
quoll
 quoll
(@quoll)
ゲスト
結合: 17年前
投稿: 8
Topic starter  

FUKUさんありがとうございます。
WM_COPYDATAで渡すと無事に文字列を渡すことができました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました