WebBrowserコントロール内部でImeModeを取得するには?

解決


まさかさ  2008-05-13 17:02:49  No: 144743  IP: 192.*.*.*

お世話になります。

現在、WebBrowserコントロールを使ってタブブラウザを作成しています。

作成したい動作としては、
タブ切り替え前、切り替え後の両方でInputBoxにfocusが当たっている場合、
タブを切り替えた際にImeModeをそのまま使用する。
というものです。

困っているのは、InputBoxでImeModeをOnにしても、
WebBrowser.ImeMode、TabPage.ImeMode、Form.ImeModeで検知できないという事です。

imm32.dllのImmGetConversionStatusも調べたのですが、
そもそもWebBrowser.Documentのウィンドウハンドルは一体何であるのか?
という所で止まってしまいました。

どなたかご教授頂ければと思っています。

なお、タブの切り替え時にタブページが保有しているWebBrowserコントロールのActiveElementにfocusを当てています。

編集 削除
Hongliang  2008-05-13 18:29:46  No: 144744  IP: 192.*.*.*

Control.ImeMode プロパティは、そのコントロールの IME の「初期値」を設定するプロパティです。現在の IME の状態を表すものではありません。
IME の状態はスレッド単位で管理されるので、WebBrowser の IME の状態とその WebBrowser が乗っているフォームの IME の状態は同一です。

ところで普通にタブブラウザを実装した場合、全てのタブ上のブラウザで IME 状態は共通になるはずですが。前述どおり、IME の状態はスレッド単位で管理されるので。
もちろんスタイルシートで ime-mode を設定している場合はそこで強制的に切り替わるでしょうけど、このときの変更を制御したいってことですか?

編集 削除
まさかさ  2008-05-13 19:15:47  No: 144745  IP: 192.*.*.*

返信の方どうもありがとうございます。

Control.ImeModeは完全に私の知識不足でした。
まったく使い方が異なっていたという事ですね・・。

Hongliangさんの質問についてですが、

>IME の状態はスレッド単位で管理されるので、WebBrowser の IME の状態とその WebBrowser が乗っているフォームの IME の状態は同一です。
>ところで普通にタブブラウザを実装した場合、全てのタブ上のブラウザで IME 状態は共通になるはずですが。前述どおり、IME の状態はスレッド単位で管理されるので。

との事なのですが、同一のWebBrowserコントロールにいる場合は確かにスレッドが同一のためImeModeは状態が保持されているのですが、以下の2通りのケースでImeが初期化されてしまって困っています。

1.別タブのWebBrowserを開いた。  →これはスレッドが別だからと推測

2.タブはそのままで、他のコントロールにFocusを当てて、再度タブ内部のページをクリックした場合。
    →これについてはスタイルシートが問題?

>もちろんスタイルシートで ime-mode を設定している場合はそこで強制的に切り替わるでしょうけど、このときの変更を制御したいってことですか?

実際に作成したい動作の説明がわかりにくくすみません。
最終的に行いたいのは、TabPageごとにImeModeを管理するという事です。
TabPageが切り替わる際に、ImeModeを取得しておき、再度そのTabPageが選択されたらImeModeを復元するという事です。

編集 削除
Hongliang  2008-05-14 15:51:52  No: 144746  IP: 192.*.*.*

1 と 2、両方の現象を確認しました。今まで気にしてませんでしたが、これはなかなかひどい動作ですね。タブを増やしたりなどしばらく操作してると普通に共有されるようになったり、理解に苦しみます。
取り敢えず、.NET 1.1 with AxWebBrowser では問題なく動作しているように見えるので、.NET 2.0 以降限定の問題かもしれません。WPF で (Ax)WebBrowser をホストしても再現します。
.NET 2.0 と言えばコンテナコントロールで IME が無効になるって仕様変更が思いつきますが、今調べたところタブにフォーカスがあるときに IME が有効になるって変更もあるんですね。TabControl.ImeMode を Disable にすると微妙に動作が変わったりします。

この問題については私は詳しくないのでどなたか詳しい方の解説を期待してください。
// バグっぽいから MSDN Forum の Visual Studio フィードバック フォーラムでもいいかも。

> 最終的に行いたいのは、TabPageごとにImeModeを管理するという事です。
> TabPageが切り替わる際に、ImeModeを取得しておき、再度そのTabPageが選択されたらImeModeを復元するという事です。
これ自体は imm 系の API と TabPage 選択系のイベントを使えば実現はそんなに難しくないと思います。上の問題がなければ。
// Text Services Framework との兼ね合い的にはどうなんだろう?

編集 削除
まさかさ  2008-05-14 21:09:34  No: 144747  IP: 192.*.*.*

Hongliangさん、実際に検証していただくなどしていただきありがとうございました。
なんとか解決(?)となりました。
http://www.geocities.co.jp/siliconvalley/4805/vbtips/vbtips076.htm
このサイトにある方法でIMEのオン/オフをコントロールのLostFocusイベントから取得し、各タブ毎にメンバ変数で保持、GotFocusのタイミングで戻すといった流れで実装することができました。
(本当はEnter、Leaveがよいのでしょうが、対象のコントロールがWebBrowserであったため、ちょっと古いイベントを使っています。)
かなり強引な方法と思いますが、一応後発の同じ問題に当たった人のために状況を報告させていただきました。

本当にありがとうございました。

編集 削除