IMEパッドを起動したい – プログラミング – Home

通知
すべてクリア

[解決済] IMEパッドを起動したい


Yasu
 Yasu
(@Yasu)
ゲスト
結合: 23年前
投稿: 5
Topic starter  

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


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

ちょっと試してみました。

とりあえず、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
 Yasu
(@Yasu)
ゲスト
結合: 23年前
投稿: 5
Topic starter  

有効なヒント、有難うございます。メニュー呼出は上手く行きそうですね。
当方、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
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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

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

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


返信引用
Yasu
 Yasu
(@Yasu)
ゲスト
結合: 23年前
投稿: 5
Topic starter  

IMEパッドの呼出し、行き詰まってます

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

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

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


返信引用
Yasu
 Yasu
(@Yasu)
ゲスト
結合: 23年前
投稿: 1
 

解決しました。

結局、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);


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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