DOBON.NET DOBON.NETプログラミング掲示板過去ログ

テキストボックスで日本語変換中を知る方法

環境/言語:[VB.NET .NET1.1 or 2.0]
分類:[(未選択)]

テキストボックスをたくさん並べたフォームで、テキストボックス間のフォーカスの移動を矢印キーで行おうと思い、KeyUpイベントで検出してフォーカス移動できるようになりました。
ところが、テキストボックスで日本語を入力して変換中の操作で矢印キーを押しても、フォーカスが移動してしまいます。
これを避けるため変換中は移動しないようにしたいのですが、変換中かどうかを知る方法が分かりません。
どなたかご存じの方、方法を教えてください。よろしくお願いします。
■No20687に返信(農民さんの記事)
> これを避けるため変換中は移動しないようにしたいのですが、変換中かどうかを知る方法が分かりません。

詳しく調べたわけではないので、あくまでも参考程度の話ですが、
個人的に簡単なテストをする時などは WM_IME_STARTCOMPOSITION,
WM_IME_ENDCOMPOSITION で判断しています。(textBox の WndProc)
■No20687に返信(農民さんの記事)
> ところが、テキストボックスで日本語を入力して変換中の操作で矢印キーを押しても、フォーカスが移動してしまいます。
こんちは

    Private Sub TextBox1_PreviewKeyDown(ByVal sender As Object,
      ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs)
         Handles TextBox1.PreviewKeyDown
        Select Case e.KeyCode
            '矢印キーが押されたことを表示する
            Case Keys.Up, Keys.Left, Keys.Right, Keys.Down
                Console.WriteLine("矢印キーが押されました。")
        End Select
    End Sub
と、こちらのサンプルで試してみたら、漢字入力して変換中の操作では、
("矢印キーが押されました。")は表示されないのでOKですヨ VB2005
つまり、これなら、変換中以外の操作だけ矢印キーが捕捉できます
■No20692に返信(y4yamaさんの記事)
> ■No20687に返信(農民さんの記事)
> Private Sub TextBox1_PreviewKeyDown(ByVal sender As Object,
>       ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs)
>          Handles TextBox1.PreviewKeyDown

こんにちは
試してみました。ほんとだうまくいきます。
暫定的にですが、こっちで実装しておくことにします。ありがとうございました。

ただPreviewKeyDownイベントは.NET1.1で使えないので、引き続き他の解決策があれば募集しておりますので、よろしくお願いします。
PInvokeが必要ない解決策があればいいんですが・・・
Grid系コントロールが使えない表組みアプリを作るとき、みなさんどうしてるんでしょうか・・・。
> 詳しく調べたわけではないので、あくまでも参考程度の話ですが、
> 個人的に簡単なテストをする時などは WM_IME_STARTCOMPOSITION,
> WM_IME_ENDCOMPOSITION で判断しています。(textBox の WndProc)

こんにちは
質問に書いておけばよかったのですが、Windows98からVistaまで視野に入れないといけないため、PInvokeは可能な限り避けたい意向です。
もちろん、それしか方法がないのなら各OS別PInvokeを書くつもりですが。

Grid系コントロールが使えない表組み(行列入れ替えを可能にし、行、列とも可変です)なため、基本操作だけでいい表コントロールを自作している最中です。
よろしくお願い致します。
■No20694に返信(農民さんの記事)

日本語変換中を知る方法ではありませんが、私はTextBoxを
矢印キーでフォーカスを移動させてますが、いつも
KeyDownイベントに書いています。下記参照。

VB2005ではKeyDownに記述すると変換中に移動されませんでした。
KeyUpでは変換中に移動しました。

Private Sub txt_00F00_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txt_00F00.KeyDown

Dim iSelLength As Integer
Dim iSelStart As Integer

SelLength = txt_00F00.SelectionLength 'テキスト内の選択範囲長
iSelStart = txt_00F00.SelectionStart 'テキスト内のカーソル位置

If (e.KeyCode = Keys.Return) Or _
(e.KeyCode = Keys.Up) Or _
(e.KeyCode = Keys.Down) Or _
(e.KeyCode = Keys.Left And iSelStart = 0 And iSelLength = 0) Or _
(e.KeyCode = Keys.Right And iSelStart = txt_00F00.Text.Length) Then

'フォーカス移動処理
Select Case e.KeyCode
Case Keys.Return
Case Keys.Up
Case Keys.Down
Case Keys.Left
Case Keys.Right
End Select
End If
■No20720に返信(くりんさんの記事)
> ■No20694に返信(農民さんの記事)

> VB2005ではKeyDownに記述すると変換中に移動されませんでした。
> KeyUpでは変換中に移動しました。

お返事が遅れまして申し訳ないです。確認しまして、おっしゃるとおりでした。
キーリピートの対策が不要そうなので安易にKeyUpを選択していました。
なぜKeyDownとKeyUpで動作が違うのか理由がわかりませんが、問題点は解決できますので本件はこれにて解決済みです。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板