none
KeyPressでCtrlを押している状態を知りたい

    質問

  • いつも参考にさせていただいています。

    Textbox入力時に数字のみ入力を許可したいので下記のようにKeyPressでチェックをつけています。(マウスで右クリックから貼り付けをすれば入力できてしまうというのは別で解決するとして、、)

    -----------------------------------------------------------------------------------------

        Private Sub TextBox1_KeyPress(ByVal sender As Object, 

    ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress

            If Asc(e.KeyChar) <> Asc(vbBack) Then
                '数字のみ
                If e.KeyChar >= "0" And e.KeyChar <= "9" Then
                    'ok
                Else
                    e.Handled = True
                End If
            End If

        End Sub

    -----------------------------------------------------------------------------------------

    しかし、これではCtrl+Cでのコピーもできなくなってしまいます。

    KeyPress内で「Ctrlを押しながら」ということを判断することはできないでしょうか。

    よろしくお願いします。

    2007年1月10日 7:07

回答

  • keiz さん、こんにちは。
    お役に立てたようで、何よりです。

     keiz さんからの引用
    じゃんぬねっと様ありがとうございます。下記のように書くことで何とか制御できそうです。

     If System.Windows.Forms.Control.ModifierKeys <> Keys.Control Then
          e.Handled = True
    End If

    Windows 的に、この実装は NG です。
    たとえば、[Shift] + [Control] の場合弾かれてしまいます。(これが、Windows 的でない)

    あと、KeyPress イベントではなくて、Process~ 関係のメソッドのオーバーライドしても可能です。
    こちらについても、時間がある時に調べてみてください。

    2007年1月10日 8:15

すべての返信

  • こんにちは~。

     

    テキストボックスにかかわる補助キーは、以前自分も調べたのですが、どーやらKeyDownかKeyUpでしか取れないみたいです。

    KeyDownイベントで、Ctrlキー+C押下時にテキストボックスにハンドルがあるのであれば…みたいな処理にしたほうがいいかと思われます。

    2007年1月10日 7:18
  • 無理やりですが、

    System.Windows.Forms.Control.ModifierKeys が使えませんか?

    2007年1月10日 7:42
  • じゃんぬねっと様ありがとうございます。下記のように書くことで何とか制御できそうです。

    -------------------------------------------------------------------

     If System.Windows.Forms.Control.ModifierKeys <> Keys.Control Then
          e.Handled = True
    End If

    -------------------------------------------------------------------

    ちなみに、下記のような区別をすることもできそうです(現在検証中)

    -------------------------------------------------------------------

    単純に"c"を入力した場合のascコード

    ?e.KeyChar
    "c"c
    ?Asc(e.KeyChar)
    99

    ctrlを押しながら"c"を入力した場合のコード

    ?e.KeyChar
    "L"c   <= 文字化けしたLのような文字に見える
    ?Asc(e.KeyChar)
    3

    -------------------------------------------------------------------

     

    2007年1月10日 8:08
  • keiz さん、こんにちは。
    お役に立てたようで、何よりです。

     keiz さんからの引用
    じゃんぬねっと様ありがとうございます。下記のように書くことで何とか制御できそうです。

     If System.Windows.Forms.Control.ModifierKeys <> Keys.Control Then
          e.Handled = True
    End If

    Windows 的に、この実装は NG です。
    たとえば、[Shift] + [Control] の場合弾かれてしまいます。(これが、Windows 的でない)

    あと、KeyPress イベントではなくて、Process~ 関係のメソッドのオーバーライドしても可能です。
    こちらについても、時間がある時に調べてみてください。

    2007年1月10日 8:15
  • どうも、ご返答がないようなので、勝手に解説します。

     じゃんぬねっと さんからの引用
    Windows 的に、この実装は NG です。
    たとえば、[Shift] + [Control] の場合弾かれてしまいます。(これが、Windows 的でない)

    下記のような実装にすると、単独の [Shift] キー以外も読み取れます。

    VB.NET

    ' Imports System.Windows.Forms しているとする
    
    If (Control.ModifierKeys And Keys.Control) = Keys.Control Then
        e.Handled = True
    End If
    2007年1月11日 2:47
  • じゃんぬねっと様
    >どうも、ご返答がないようなので、勝手に解説します。
    すいません。詳しく解説までしていただいてありがとうございます。

    今回、Control.ModifierKeysを詳しく調べる良い機会になりました。
    また、(Control.ModifierKeys And Keys.Control) = Keys.Controlとする書き方は
    なんとなく意味はわかるのですが、完全に理解するにはもう少し勉強が必要です。
    ためしに、プログラムに書いてみましたが、うまく動作しました。

    [Shift] + [Control] の場合など、様々なキー操作に対する準備(想定)をしておく
    必要があることも勉強になりました。

    これからもよろしくお願いします。

    2007年1月11日 13:16
  • ダッチです。

     keiz さんからの引用
    また、(Control.ModifierKeys And Keys.Control) = Keys.Controlとする書き方は
    なんとなく意味はわかるのですが、完全に理解するにはもう少し勉強が必要です。

    最初の () で囲まれている部分はビット演算を行っています。 And は論理積ですね。
    その結果と Keys.Control を比較しているということですね。

    2007年1月11日 13:52