none
スクロールバーがキーボードイベントを受け取らないようにするには? RRS feed

  • 質問

  •  お世話になります。

     

    フォーム上に貼り付けられたスクロールバーがあり、

    スクロールバーの移動はマウスのみで行い、

    キーボードからの入力(カーソルキー、Home、End、PageUp、PageDown等)

    を受け取らないようにするにはどうすればいいのでしょうか?

     

    キーボードからの入力は別処理で利用するつもりです。

     

    環境は

    Windows XP Pro、Vista Ultimate

    Visual Studio 2005 Pro

    です。

    よろしくお願いします。


     

    2007年11月12日 10:57

回答

  • ニムファエア さん、こんにちは

    ダッチです。

     

     ニムファエア さんからの引用
    キーボードからの入力は別処理で利用するつもりです。
    これをどのようにしてやろうとしているのかが不明ですが、新しくスクロールバーを継承したコントロールを作成し、そのコントロールで ProcessCmdKey メソッドをオーバーライドしてやればできますよ。

     

    例えば、次のようにしてやると PageDown キーを無効化できます。

     

    PageDown キー無効サンプル

        protected override bool ProcessCmdKey( ref Message msg, Keys keyData )
        {
            if (( keyData & Keys.KeyCode ) == Keys.PageDown)
            {
                return true;
            }
            return base.ProcessCmdKey( ref msg, keyData );
        }

     

     

    2007年11月12日 12:27
  • あ!ごめんなさい C# でしたね。

     

    ここの部分ですが
        switch( keyData ) {
    これだと Control キーなどと一緒に Up キーを押された場合は無効化できません。
    なので一旦 keyData から KeyCode を抽出してその結果と Up キーなどを比べる必要があります。

     

    こんな感じです。
        switch( keyData & Keys.KeyCode) {

     

    こっそり私の最初の投稿も直しておきました。

    2007年11月13日 3:44

すべての返信

  • ニムファエア さん、こんにちは

    ダッチです。

     

     ニムファエア さんからの引用
    キーボードからの入力は別処理で利用するつもりです。
    これをどのようにしてやろうとしているのかが不明ですが、新しくスクロールバーを継承したコントロールを作成し、そのコントロールで ProcessCmdKey メソッドをオーバーライドしてやればできますよ。

     

    例えば、次のようにしてやると PageDown キーを無効化できます。

     

    PageDown キー無効サンプル

        protected override bool ProcessCmdKey( ref Message msg, Keys keyData )
        {
            if (( keyData & Keys.KeyCode ) == Keys.PageDown)
            {
                return true;
            }
            return base.ProcessCmdKey( ref msg, keyData );
        }

     

     

    2007年11月12日 12:27
  • ダッチ様、早速のご解答ありがとうございます。

     

     ダッチ さんからの引用

    これをどのようにしてやろうとしているのかが不明ですが、新しくスクロールバーを継承したコントロールを作成し、そのコントロールで ProcessCmdKey メソッドをオーバーライドしてやればできますよ。

     

    ダッチ様に提示していただいたコードを参考に以下のコードで希望通りの動作を確認できました。

    キーイベントのオーバーライド

        protected override bool ProcessCmdKey( ref Message msg, Keys keyData )
        {
            switch( keyData ) {
            case Keys.Up:

                // 行いたい処理
                break;
            case Keys.Down:

                // 行いたい処理
                break;
            default:
                return base.ProcessCmdKey( ref msg, keyData );
            }

            return true;
        }

     

     

    ダッチ様、ありがとうございました ヾ(〃^∇^)ノ♪
    2007年11月12日 13:29
  • あ!ごめんなさい C# でしたね。

     

    ここの部分ですが
        switch( keyData ) {
    これだと Control キーなどと一緒に Up キーを押された場合は無効化できません。
    なので一旦 keyData から KeyCode を抽出してその結果と Up キーなどを比べる必要があります。

     

    こんな感じです。
        switch( keyData & Keys.KeyCode) {

     

    こっそり私の最初の投稿も直しておきました。

    2007年11月13日 3:44
  • ダッチ様、アドバイスありがとうございますw

     

     ダッチ さんからの引用

    ここの部分ですが
        switch( keyData ) {
    これだと Control キーなどと一緒に Up キーを押された場合は無効化できません。
    なので一旦 keyData から KeyCode を抽出してその結果と Up キーなどを比べる必要があります。

     

    この部分に関しましては、

    今回作成しているソフトはShift、Ctrl、Altキーとの同時押しを必要とする処理以外は、

    たとえ押されていても押されていない場合の処理を行うように作成しているため、

    システムキーとの同時押し判定はcase文の中で行っています。

    紛らわしくてすみません ^ ^;

     

    C#を始めて日が浅い上に、まだコードの確認が済んでいないので

    また疑問が湧きましたらご質問させてください♪

    2007年11月14日 12:54