none
KeyDown時の無効音を消すには RRS feed

  • 質問

  • TextBoxのKeyDownイベントにて、Alt+D2キーで、
    ある処理を行うコードを実行しますと、
    処理は正常におこなわれますが、同時にポーンという
    無効キーの打鍵音?が鳴ってしまいます。
    ただ、不思議な事にAlt+NumPad2だと、音はなりません。

    Altキーと同時打鍵の時は、KeyPressイベントで拾えないようで、
    解決策が思いつきません。
    環境はVB2005です。
    どなたか解決策をご存じの方、よろしくお願いいたします。

    (補足)
    実際はカスタムコントロールのOnKeyDownなんですが、
    事情は同じと思います。

    2006年9月7日 6:38

回答

  • Deer327 さん、こんにちは。

     Deer327 さんからの引用
    Altキーと同時打鍵の時は、KeyPressイベントで拾えないようで、解決策が思いつきません。

    それより前の段階でキャンセルしてしまうとか。
    たとえば、ProcessCmdKey メソッドをオーバーライドして、keyData から捕捉する。

    # あまり、美しくない方法ですけどね。

    2006年9月7日 7:43
  •  Deer327 さんからの引用
    試しに以下のコードで実行してみたんですが、
    どのキーストロークでもメソッドが呼び出されませんでした。

        Protected Shadows Function ProcessCmdKey( _
    (省略)
    加えて下記のような記事を読みますと

    (@IT.NET TIPSの記事より引用)
    > フォームやコントロール側で完全にキー処理を制御するには
    > (つまり、デフォルト処理を一切行わない場合)、プリプロセスの
    > ProcessCmdKeyメソッドをオーバーライドするとよいだろう。

    うーん...
    コードが動かない以前に、どうも私には敷居が高いような気がします。
    あきらめるのもくやしいですけど。

    「@IT」
     - 「Windowsアプリケーションでキー処理が行われる順序は?
     - 「Windowsアプリケーションで方向キーなどの特殊キーを処理するには?

    多分、この辺の記事の事をおっしゃているのでしょうけど、
    もう少しじっくり読んでみましょう。
    あと、知らない(分からない)キーワードが出てきたら、
    先ずは、ドキュメントを読む様にしましょう。
    # 何事も一朝一夕にはいかないものです。

    「MSDN」
     - 「Visual Basic 言語リファレンス」
      - 「Function ステートメント
      - 「Overrides
      - 「Shadows

     - 「サンプル」
      - 「コード : コントロールで受け入れるキーストロークを制限する (Visual Basic)

     Deer327 さんからの引用
    ショートカットキーの割当てについては、うまく動作しました。
    ですが、これだと制御がボタン側に遷移してしまいます。
    できればカスタムコントロール内で制御したいと思っています。
    # んー、デフォルトでその様な動作だったかなぁ。

     Deer327 さんからの引用
    ProcessMnemonicのオーバーライドについては、
    スキル不足の為、手法がイメージできず試せませんでした。
    オーバーライドについては、ProcessCmdKeyの方が分かれば、こちらも分かりますね。

    「MSDN」
     - 「Visual Studio ドキュメント」
      - 「クラスと型のデザインおよび表示
       - 「方法 : 型のメンバをオーバーライドする

    2006年9月7日 17:40

すべての返信

  • Deer327 さん、こんにちは。

     Deer327 さんからの引用
    Altキーと同時打鍵の時は、KeyPressイベントで拾えないようで、解決策が思いつきません。

    それより前の段階でキャンセルしてしまうとか。
    たとえば、ProcessCmdKey メソッドをオーバーライドして、keyData から捕捉する。

    # あまり、美しくない方法ですけどね。

    2006年9月7日 7:43
  •  Deer327 さんからの引用
    TextBoxのKeyDownイベントにて、Alt+D2キーで、
    ある処理を行うコードを実行しますと、
    処理は正常におこなわれますが、同時にポーンという
    無効キーの打鍵音?が鳴ってしまいます。
    ただ、不思議な事にAlt+NumPad2だと、音はなりません。

    その「ある処理」と同じ処理を行うボタンやメニューが別にあるのであれば、
    ショートカット(アクセス) キーを割り当てるか、
    ProcessMnemonicをオーバーライドするとか。
    2006年9月7日 11:59
  • じゃんぬねっとさん、こんにちは。
    いつもありがとうございます。

     じゃんぬねっと さんからの引用

    それより前の段階でキャンセルしてしまうとか。
    たとえば、ProcessCmdKey メソッドをオーバーライドして、keyData から捕捉する。

    試しに以下のコードで実行してみたんですが、
    どのキーストロークでもメソッドが呼び出されませんでした。

        Protected Shadows Function ProcessCmdKey( _
        ByRef msg As System.Windows.Forms.Message, _
        ByVal keyData As System.Windows.Forms.Keys) As Boolean
            If keyData = (Keys.Alt Or Keys.D2) _
            Or keyData = (Keys.Alt Or Keys.NumPad2) Then
                Return True
                RaiseEvent MyDialogCalled(Me, New System.EventArgs)
            Else
                Return False
            End If
        End Function

    加えて下記のような記事を読みますと

    (@IT.NET TIPSの記事より引用)
    > フォームやコントロール側で完全にキー処理を制御するには
    > (つまり、デフォルト処理を一切行わない場合)、プリプロセスの
    > ProcessCmdKeyメソッドをオーバーライドするとよいだろう。

    うーん...
    コードが動かない以前に、どうも私には敷居が高いような気がします。
    あきらめるのもくやしいですけど。

    2006年9月7日 12:51
  • 辛島さん、こんにちは。
    レスありがとうございます。

     辛島 さんからの引用

    その「ある処理」と同じ処理を行うボタンやメニューが別にあるのであれば、
    ショートカット(アクセス) キーを割り当てるか、
    ProcessMnemonicをオーバーライドするとか。

    ショートカットキーの割当てについては、うまく動作しました。
    ですが、これだと制御がボタン側に遷移してしまいます。
    できればカスタムコントロール内で制御したいと思っています。

    ProcessMnemonicのオーバーライドについては、
    スキル不足の為、手法がイメージできず試せませんでした。
    せっかくのご提案をすみません。

    2006年9月7日 12:55
  •  Deer327 さんからの引用
    試しに以下のコードで実行してみたんですが、
    どのキーストロークでもメソッドが呼び出されませんでした。

        Protected Shadows Function ProcessCmdKey( _
    (省略)
    加えて下記のような記事を読みますと

    (@IT.NET TIPSの記事より引用)
    > フォームやコントロール側で完全にキー処理を制御するには
    > (つまり、デフォルト処理を一切行わない場合)、プリプロセスの
    > ProcessCmdKeyメソッドをオーバーライドするとよいだろう。

    うーん...
    コードが動かない以前に、どうも私には敷居が高いような気がします。
    あきらめるのもくやしいですけど。

    「@IT」
     - 「Windowsアプリケーションでキー処理が行われる順序は?
     - 「Windowsアプリケーションで方向キーなどの特殊キーを処理するには?

    多分、この辺の記事の事をおっしゃているのでしょうけど、
    もう少しじっくり読んでみましょう。
    あと、知らない(分からない)キーワードが出てきたら、
    先ずは、ドキュメントを読む様にしましょう。
    # 何事も一朝一夕にはいかないものです。

    「MSDN」
     - 「Visual Basic 言語リファレンス」
      - 「Function ステートメント
      - 「Overrides
      - 「Shadows

     - 「サンプル」
      - 「コード : コントロールで受け入れるキーストロークを制限する (Visual Basic)

     Deer327 さんからの引用
    ショートカットキーの割当てについては、うまく動作しました。
    ですが、これだと制御がボタン側に遷移してしまいます。
    できればカスタムコントロール内で制御したいと思っています。
    # んー、デフォルトでその様な動作だったかなぁ。

     Deer327 さんからの引用
    ProcessMnemonicのオーバーライドについては、
    スキル不足の為、手法がイメージできず試せませんでした。
    オーバーライドについては、ProcessCmdKeyの方が分かれば、こちらも分かりますね。

    「MSDN」
     - 「Visual Studio ドキュメント」
      - 「クラスと型のデザインおよび表示
       - 「方法 : 型のメンバをオーバーライドする

    2006年9月7日 17:40
  • 辛島さん、こんにちは。

     辛島 さんからの引用

    「@IT」
     - 「Windowsアプリケーションでキー処理が行われる順序は?」
     - 「Windowsアプリケーションで方向キーなどの特殊キーを処理するには?」

    多分、この辺の記事の事をおっしゃているのでしょうけど、
    もう少しじっくり読んでみましょう。

    レスを参考に、以下のコードで動作確認できました。

    [VB2005]
        Protected Overrides Function ProcessDialogChar( _
        ByVal charCode As Char) As Boolean
            If charCode = "2" Then
                'Alt+2キーでダイアログを表示する
                RaiseEvent MyDialogCalled(Me, New System.EventArgs)
                Return True
            Else
                Return MyBase.ProcessDialogChar(charCode)
            End If
        End Function

    キー制御がこんなに奥が深い物とは...再認識しました。
    辛島さん & じゃんぬねっとさん、及び@IT.NET Tips担当者さん
    ありがとうございました。

    #もっとドキュメント読み込まないとだめですね。
    #耳が痛かったです。m(_ _)m

    2006年9月8日 5:08
  • 一点、記載を忘れましたので、自己レスです。
    Altキーの組み合わせで、テンキー側は拾えませんでした。
    ショートカットキーという事を考えれば、
    全く問題ありませんが、一応ご報告しておきます。
    2006年9月8日 5:22