IMEパッドを起動したい

[戻る]
Yasu [E-Mail] 2002/09/03(火) 11:56:34
くだらない質問かもしれませんが、VC++6.0 上で MFC を使用したAPIから IMEパッド(手書き
入力) を起動したいのです。
IME の On/Off や プロパティ表示はできたのですが、IMEパッドの起動方法が分りません。分
る方、ご教授ください。
もしかして、IME のバージョン等にも依存するかな?? 現在の対象は IME98 です。

dairygoods 2002/09/03(火) 14:16:03
ちょっと試してみました。

とりあえず、IMEパッドのメニューを選択してやれば、
パッドウィンドウを出すことはできました。

IMEパッドのメニューIDは、ImmGetImeMenuItems()で調べたところ、
2002でしたが、環境依存かもしれません。(Win2000で確認)

// m_editはCEditオブジェクト
m_edit.SetFocus();
HIMC himc = ImmGetContext(m_edit);
ImmSetOpenStatus(himc, TRUE);
ImmNotifyIME(himc, NI_IMEMENUSELECTED, 2002, 0);
ImmReleaseContext(m_edit, himc);

Yasu [E-Mail] 2002/09/03(火) 16:43:30
有効なヒント、有難うございます。メニュー呼出は上手く行きそうですね。
当方、OS は Win98 ですが、メニューIDは異なるのか、うまく行きませんでした。
ImmGetImeMenuItems の使い方押して頂けませんか?

以下の様ようにしたのですが、

BOOL b = ImmSetOpenStatus( hIMC, TRUE );

IMEMENUITEMINFO    imeme;
int i = ImmGetImeMenuItems(hIMC,IGIMIF_RIGHTMENU,IGIMII_TOOLS,NULL,&imeme,sizeof
(IMEMENUITEMINFO));

ここで、b==TRUE になるのですが、i==0 となり、imeme には何も帰っていないようです??

もう一つ、
ImmGetImeMenuItems を呼び出すと未定義でエラーとなりました。環境確認すると、WINVER
が 0x400 (Windows95?)に設定されていました。この関数は、Win98以降 となっていて呼び出
せなかったので、"stdafx.h" 内で #define WINVER 0x40A としてしまいましたが、この辺も
勘違いがありますか?

dairygoods 2002/09/03(火) 17:22:48
ImmGetImeMenuItems()
この関数は、複数のメニュー項目を返すようです。
最初に&imemeのところをNULLにして呼び出すと、戻り値として個数が得られますので、
その個数分のIMEMENUITEMINFO配列を用意して再度呼び出します。

また、第二引数は0でよいと思います。
IGIMIF_RIGHTMENUは右クリックメニューを調べるときに指定するようです。

IMEツールバーが実際に表示されている状態(フォーカスがある状態)
でないと反応しません。デバッガなどで止めると出ませんでした。

Yasu [E-Mail] 2002/09/04(水) 12:34:35
IMEパッドの呼出し、行き詰まってます

関数 ImmGetImeMenuItems で、Win98SE + IME98 では最初メニューが取出せませんでした。
が、IMEを「タスクバーにいれる」と取出せるようになりました。^^;
IMEパッドのメニューIDは、0x7d2 で IME2000 と同じです。

なお、Wn98SE + IME2000 の環境では、このような事は起きませんで、常にメニューが読み込
めました。

しかし、ImmNotifyIME からIMEパッドを呼び出すことはできませんでした。ImmNotifyIME の
リターンは TRUE になりますが、何も起きてくれません。
また何か分かりましたら、書き込みます

Yasu [E-Mail] 2002/09/18(水) 18:57:02
[[解決]]
解決しました。

結局、Win98 と IME98 (おそらく IME98側) の組合せでエディットにフォーカスがない間に発
行されたメッセージを無視しているようです。先のプログラムを独立したボタン内で呼び出して
いたので、応答が無かったようです。
さらに、エディットコントロールがフォーカスしたタイミングで、IMEのOn/Off状況も変化して
いて、状況が掴めなくなっていました。

エディットコントロールがフォーカスされたタイミングで、ImmNotifyIME を実行させてIMEパ
ッドが呼び出せるようになりました。
なお、IME2000 は IMEがONなら エディットにフォーカスしてなくてもIMEパッドが起動できる
みたいです。(詳しく試してませんが)


また、VBからの呼出を以下のページで見つけました。

http://www.mitene.or.jp/~sugisita/family/papa/vb/index.html


こちらでは、以下のコードでIMEパッドを呼び出しています。これも環境に依存しそうです。
ちなみに、この場合、IMEをONしておく必要はありませんでした。もちろん、エディットコント
ロールのフォーカスがあるときのみ有効でした。

// メッセージの登録
DWORD WM_MSIME_SHOWIMEPAD = ::RegisterWindowMessage("MSIMEShowImePad");
// IME の HWND所得
HWND htt = ImmGetDefaultIMEWnd( m_hWnd );
// メッセージを送信
::SendMessage(htt,WM_MSIME_SHOWIMEPAD,0L,0L);

古いスレッドには追加発言できません。