【C#】キーリピートを判断する方法

C#
この記事は約3分で読めます。

ずっと同じキーを押した場合の処理を実装してみました。使いどころはカーソルの移動とか音量の調整とかによさそうですね。

キーリピートに対応してみた

実装方法

OnKeyDownイベントでキーが押しっぱなしかの情報を取得できればいいのですが、取れないようです。そのため、キーリピートはウィンドウメッセージの WM_KEYDOWN(0x0100) が発生した場合にlParamパラメータの30ビット目で判断できるようです。

lParamパラメータの30ビット目

前のキー状態。値は、メッセージが送信される前にキーがダウンしている場合は1、キーがアップしている場合はゼロです

ソース

OnKeyDownイベントなんかでIsKeyRepeatがtrueならキーが押しっぱなしと判断します。

using System.Diagnostics;
using System.Windows.Forms;

namespace Test {
    public partial class Form1 : Form {

        private bool IsKeyRepeat = false;

        public Form1() {
            InitializeComponent();
        }

        protected override void WndProc(ref Message m) {
            switch (m.Msg) {
                case 0x100:
                    this.IsKeyRepeat = (m.LParam.ToInt32() & 0x40000000) != 0;
                    break;
                case 0x101:
                    this.IsKeyRepeat = false;
                    break;
                default:
                    break;
            }
            base.WndProc(ref m);
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e) {
            Debug.WriteLine(this.IsKeyRepeat);
        }
    }
}

実装例

自作テキストエディタで試してみました。通常の上下キーは1行単位で移動しますが、連続で押した場合、上キーは1行単位、下キーは10行単位に移動するようにしています。

ちょっとわかりにくいですねw

コメント

タイトルとURLをコピーしました