• ベストアンサー

キーイベントに関してなのですが・・・

C#を使用しているんですが、テキストボックスをひとつ設置して、KeyDownイベントが発生した時に、同じキーが2度入力されたようにできませんか? aと入力したらテキストボックスにはaaと入力される感じです。 sendKeyメソッドを使用しようとしたら、大文字になってしまいます・・・ KeyCodeからキーボード判定はできたりしませんか? よろしければ教えてください><

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんばんは。  SendKeyで送るよりも、TextChangedイベントで二重入力対象の文字をテキストボックスに追加する手段を取った方が良さそうです。  TextChanged内でテキストボックスに向かってテキストを設定すると、再びTextChangedイベントが呼ばれてしまうので、フラグを設けてスキップするようにします。  二重入力対象の文字を追加した後は、キャレットの位置を自前で正しい位置に設定する必要があります。  更にKeyPressイベントで、二重入力対象の文字であるかどうかを判断します。それ以外ならば、何もさせずにOSに処理をさせます。  本来、テキストボックスへの入力に横槍を入れる事は、望ましくない事です。  例えば、スペースやバックスペースも含まれる為、プログラム内で迂闊にキー入力を抑止すると、文字の削除が出来なくなったりするので、思った以上に入念な確認をする必要があるからです。  以下は参考程度に。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private bool bDoubleInput = true; public Form1() { InitializeComponent(); } private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { //二重入力の対象文字 string sDoubleInput = "abcdefghijklmnopqrstuvwxyz0123456789"; foreach (Char ch in sDoubleInput) { if (ch == e.KeyChar) { this.bDoubleInput = true; return; } } //二重入力の対象ではない this.bDoubleInput = false; } private void textBox1_TextChanged(object sender, EventArgs e) { //二重入力の対象ではないので引き返す if (this.bDoubleInput == false) { this.bDoubleInput = true; return; } //再起を防ぐ為にフラグを落とす this.bDoubleInput = false; //キャレットの元の位置を確保する int tmp = this.textBox1.SelectionStart; int idx = tmp - 1; //二重入力の位置は文字列の末尾なので追加 if (this.textBox1.Text.Length == this.textBox1.SelectionStart) { this.textBox1.Text += this.textBox1.Text[idx].ToString(); } else//二重入力の位置は文字列の末尾以外なので挿入 { this.textBox1.Text = this.textBox1.Text.Insert(idx, this.textBox1.Text[idx].ToString()); } //文字を追加・挿入したのでキャレットの新しい位置を設定する this.textBox1.SelectionStart = tmp + 1; } } }

uryotti
質問者

お礼

ありがとうございました!textchangeという手があったのですね!親切にサンプルまでありがとうございました!