|
■No92490 (田中 さん) に返信 > 回避策を2つ考えたのですが、もしもう少し工夫したほうが良いとか、 > このソースをもとに何か良いご意見いただけましたら幸いです。 > > ※今回の問題とは未関係ですが、2番の方法を応用すると > OSの設定を変更しなくても、IMEモードを半角カタカナ等に > 変更できることがわかりました。 > > > 1.少し原始的ですが、SendKeysでエスケープキーのキーイベントを送信する。 > > Private Sub TextBox_GotFocus(sender As Object, e As EventArgs) Handles TextBox1.Enter, TextBox2.Enter, TextBox2.Enter > SendKeys.Send("{ESC}") > SendKeys.Send("{ESC}") > SendKeys.Send("{ESC}") > End Sub > > > 2.Text Services FrameworkにてInputScopeを変更し、別のInputScopeとして認識させて > 変換中のテキストをキャンセルさせる。 > > <DllImport("msctf.dll", SetLastError:=True, CharSet:=CharSet.Auto)> > Private Shared Function SetInputScope(ByVal hwnd As IntPtr, ByVal inputscope As IntPtr) As IntPtr > > End Function > > > Private Sub TextBox_Enter(sender As Object, e As EventArgs) Handles TextBox1.Enter, TextBox2.Enter, TextBox3.Enter > 'SetInputScope(DirectCast(sender, TextBox).Handle, 40) 'アルファベット > SetInputScope(DirectCast(sender, TextBox).Handle, 44) '日本語入力 > 'SetInputScope(DirectCast(sender, TextBox).Handle, 45) '半角カタカナ > End Sub > > Private Sub TextBox_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.KeyPress, TextBox2.KeyPress, TextBox3.KeyPress > SetInputScope(DirectCast(sender, TextBox).Handle, 0) 'デフォルト > End Sub 上記の2者択一なら2の方がいいでしょうね。 1の場合、Gotfocus発生の時点で未確定のテキストがどういう状態になっているか微妙な気がするので、エスケープキーによるキャンセルの発動により、よからぬ挙動が起こるリスクがあるような。
ただ、2もKeyPresをハンドルするのはやめた方がいいと思いますよ。未確定のまま次の文字入れたら不安定な挙動をするような気がします。
|