ずっと同じキーを押した場合の処理を実装してみました。使いどころはカーソルの移動とか音量の調整とかによさそうですね。
キーリピートに対応してみた
実装方法
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
コメント