none
入力コントロールでIME変換中にキーボードイベント取得 RRS feed

  • 質問

  • いつもお世話になっております。

    [むぎむぎ]です。

     

    環境:VS2005

    早速ご質問なのですが、現在開発しているシステムは各種ボタンのショートカットキーとしてファンクションキーを使用しています。

    標準ではファンクションキーの割当はできないようなので、フォームのKeyUpイベントにて検出しております。

    それでファンクションキーの押下イベントは制御できるのですが、一つ問題があります。

    入力コントロールで漢字変換中に、一発でカタカナ変換する場合F7を使用するケースがありますが、その際にF7押下のイベントを検出してしまい、変換が中断されボタン処理に制御が移ってしまいます。もちろんF7に限らすF9等もです。

    そこで、入力コントロールでIMEの変換中はKeyUpイベントをスルーしたいのですが、何か良い方法はないでしょうか?

    IMEで変換していない場合は、入力コントロールにフォーカスがあってもKeyUpイベントをキャッチし処理を流したいです。

    ちなみにフォームのKeyPreviewプロパティはTrueにしています。

    また、入力コントロールはPowerTools InputMan for .NET 4.0J Windows Forms Editionを使用しています。

    そもそもファンクションキーをフォームのKeyUpイベントでキャッチしているのが間違いなのでしょうか?

     

    以上、ずらずらと書いてしまいましたが、よろしくお願いいたします。

     

    2007年6月20日 1:32

すべての返信

  • IMEのON/OFFを確認するのは以下のページに書いてありました。ImmGetOpenStatusでいいと思います。

    http://www.moug.net/skillup/svbm/ya03-7.htm

     

    Public Declare Function はVBの構文ですので、DllImportを使ってください。

    http://msdn2.microsoft.com/ja-jp/library/system.runtime.interopservices.dllimportattribute(VS.80).aspx

    2007年6月23日 7:34
  • 解決済みかもしれませんが、私も同じことで悩んでいました。

    結論としては、テキストボックスのImeModeとKeyDownのKeyCodeの組み合わせで判断します。

    テキストボックスでの例ですが、

    テキストボックスのKeyDownイベントで

                If CType(sender, TextBox).ImeMode = Windows.Forms.ImeMode.Off Or CType(sender, TextBox).ImeMode = Windows.Forms.ImeMode.Disable Then
                Else
                    Select Case e.KeyCode
                        Case Keys.ProcessKey

    '漢字編集中


                        Case Keys.Return, Keys.F6, Keys.F7, Keys.F8
                            'KEYUPへ ImeModeをOFFにする
                            CType(sender, TextBox).ImeMode = Windows.Forms.ImeMode.Off
                    End Select
                End If

    フォームのKeyUpイベントで

                Select Case e.KeyCode
                    Case Keys.F6
                                If ActiveControl.ImeMode = Windows.Forms.ImeMode.Off Or ActiveControl.ImeMode = Windows.Forms.ImeMode.Disable Then

    '処理

                                End If
    私はこれで解決しました。

     

    2007年7月30日 11:00