スキップしてメイン コンテンツへ

 none
IME無効のコントロールに対してタッチキーボードが効かない RRS feed

  • 質問

  • 初めて投稿させて頂きます。いよさつまと申します。
    不慣れな点があるかと思いますが、よろしくお願いします。

    Windows10でVB.netによる開発を行っているのですが、
    フォームに配置しているテキストボックスのIMEを無効(imemode=Disabled)に設定し、
    以下の手順を行うとテキストボックスに対してタッチキーボードから入力ができなくなります。

    ①IMEを無効としたテキストボックスを配置しているフォームを開く
    ②メモ帳を開く
    ③タッチキーボードを起動する(この時、入力モードは英字入力)
    ④①のテキストボックスをマウスクリックしフォーカスをセット
    ⑤②で開いたメモ帳をマウスクリックしフォーカスをセット
    ⑥メモ帳を閉じる。フォーカスは①のテキストボックスにセットされる
    ⑦タッチキーボードを操作しても何も入力できない
    (文字、数字キーが効かない。エンターキーやスペースキー、矢印、タブなどは効く)

    この時、タッチキーボードはどのような状態となっているのでしょうか?
    また回避策はあるでしょうか?
    有益な情報が見つからないので、ご教授頂ければと思います。

    参考までに、⑥の手順でメモ帳を最小化した場合はこの事象は発生しません。
    2017年4月19日 8:46

すべての返信

  • ちょっと手順を追加して

    1. Windows10はタブレットモードではない。IMEは日本語MS IME。
    2. FormにImeMode = ImeMode.DisableとしたTextBoxを配置して実行
    3. メモ帳を起動(IME有効こうでひらがな等が入力可能であることを確認して、全文字削除しておく)
    4. タッチキーボードを起動(キーボードの上に候補が表示されるタイプで)
    5. FormのTextBoxにフォーカス(マウスでもタッチでも)
    6. メモ帳にフォーカス(マウスでもタッチでも)
    7. *** タッチキーボードでAを一回(メモ帳に変換中の「あ」が表示されている状態) ***
    8. メモ帳のクローズボタンをクリック(保存確認ダイアログは出さないように)
    9. FormのTextBoxへフォーカスが移動したが、タッチキーボードで文字入力ができない

    という手順であれば再現っぽい状態にはなりました。
    #メモ帳の代わりにコマンドプロンプトでもなりました。

    変換中の文字を入力する対象が無くなったのに、無くなった対象に変換中の文字列と変換結果の文字列を送ろうとしているのかも。
    最小化の場合は入力対象が見えないだけでなくなったわけでは無いので正しく切り替えできているのだと思います。
    だとするとタッチキーボードかOSの挙動のバグかな。

    とりあえずの回避としては、

    Public Class Form1
        Private Sub Form1_Activated(sender As Object, e As EventArgs) Handles MyBase.Activated
            'If (Me.CheckBox1.Checked) Then 'チェックボックスで動作の切り替えテスト
            If (TypeOf Me.ActiveControl Is TextBox) Then
                    Dim t As TextBox = CType(Me.ActiveControl, TextBox)
                    If (t.ImeMode = ImeMode.Disable) Then
                        Me.TextBox1.ImeMode = ImeMode.Off
                        Me.TextBox1.ImeMode = ImeMode.Disable
                    End If
                End If
            'End If
        End Sub
    End Class
    
    のように、フォームがアクティブになった時に、フォーカスのあるコントロールがTextBoxでImeMode.Disableだった場合に、いったんOffにしてから戻すことで、タッチキーボードの変換処理を止めてやると改善されるかも。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年4月19日 15:11
  • gekka様

    回答ありがとうございます。
    またお礼が遅くなりまして申し訳ございません。

    提示頂きました回避策を試してみましたが、事象が解消される事を確認しました。
    ただ稀ですがこの回避策でも事象が発生する事があります。
    現時点で条件が絞り込めてないため確実に再現させる事はできていません。

    ちなみに、こちらで確認できた他の回避方法として
    一度IMEが有効なコントロールを経由すると、事象が発生しなくなる事が確認できています。
    事象発生後にデスクトップをマウスクリックするとか、メモ帳を再度開いてマウスクリックするとか行って
    再度テキストボックスにフォーカスを戻すとタッチキーボードから入力できました。

    そのため、同じフォーム上にIMEが有効なコントロールを配置してプログラムで回避できないかと。
    以下の方法でフォーカスを遷移させて確認してみました。

    フォームがアクティブになった際に、
     ①タブでフォーカス遷移
      SendKeys.Send("{TAB}")
      Sleep(1000)
      SendKeys.Send("{TAB}")

     ②直接コントロールにフォーカスをセット
      TextBox2.Focus()
      Sleep(1000)
      TextBox1.Focus()
    を行い、無効テキストボックス→有効テキストボックス→無効テキストボックスとフォーカスを遷移させました。
    結果、
     ①:事象は解消された
     ②:事象は解消されない
    となりました。タブと直接でフォーカスを遷移すると何が違うのか全然分かりません。

    何かもう少しうまくやれそうな気がしているのですが、今のところはこのような感じです。
    もう少し試してみて、ダメそうならタッチキーボードのバグとして結論付けようと思います。


    2017年4月21日 7:36