• ベストアンサー

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

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という手があったのですね!親切にサンプルまでありがとうございました!

関連するQ&A

  • Accessでのキーイベントの処理について

    Access2007のフォームのテキストボックスに指定のキーが押されると 「指定キーの処理」→「テキストボックスは指定キーが押される前の状態にする」 上記の動作をさせようとしているのですが、「指定キーの処理」は「キーイベントの処理」でうまく行ってるのですが、どうしてもテキストボックスに「今押したキー」が入力されてしまいます。 動作は 1:キー'A'が押される 2:キーイベントの処理を実施→Private Subを実行  Private Sub TB1_KeyDown(KeyCode As Integer, Shift As Integer)    TB1_Copy = Me![TB1]    ~~~~~~~~~~~キーイベントに関する処理 ’省略    Me![TB1] = TB1_Copy  End Sub 以上の様にしているのですが、テキストボックスに「今押したキー」が入力されてしまいます。 宜しくご指導下さい。

  • タブキー押下時のイベントをひろいたい。

    テキストボックスにフォーカスがあり、TABキーが押された時のイベントをひろいたいのですが、KeyPressもKeyDownもイベントが発生しません。 (If KeyCode = vbKeyTab Then  MsgBox "タブキー" End If  If KeyAscii = vbKeyTab Then ~ のようなコードを記述してもメッセージが表示されない) ヘルプにはKeyDownでは発生しないという記述がありますが、KeyPressではイベントがひろえるようなことが書いてあるのにひろえないので困っています。 なにかよい方法はありませんでしょうか。 わかりにくい説明で申し訳ありませんが困ってます。 宜しくお願いします。

  • エクセルBVAのフォーム式のKeyCode~の意味がわかりません

    エクセルBVAです Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = vbKeyDown Then KeyCode = 0 End If End Sub ヘルプをみると キーを押したとき、およびキーを離したときに続いて発生します。KeyDown イベントはキーを押すと発生し、KeyUp イベントはキーを離すと発生します。 キーってenterのことですかね? なら、 If KeyCode = vbKeyDown Then KeyCode = 0 End If で、KeyCodeを0ににするってどういうことでしょうか?

  • TextとValueの違い?

    Access2010です。 フォームに有る数値入力のためのテキストボックスのKeyDownイベントに、入力後の値がゼロかNullか空白なら再入力させるようにコードを記述しましたがこれでは「型が一致しません」のエラーになります。 -----KeyDownイベントの内容 ここから----- Select Case Keycode Case 13 If IsNull(Me.数量.Text) Or Me.数量.Text = "" Or Me.数量.Text = 0 Then MsgBox ("数量が不正です"), vbCritical Keycode = 0 End If End Select -----KeyDownイベントの内容 ここまで----- でも、Exitイベントに同じような内容を記述した場合は希望通りの動きをします。 ※上記コードからSelectとKeycode=0を外し、TextをValueに変更。 私が何かを理解できていないのだと思いますが、何が違うのでしょう?

  • JavaScriptのキーイベント

    JavaScriptのキーイベント いつもお世話になりますm(__)m Javascriptのキーイベントで教えて下さい。 フォーム上に、テキストボックス(id=A)とセレクトボックス1(id=B)と、セレクトボックス2(id=C)があるフォームがあり、フォーム内の項目移動をキーボードで行いたいと思います。 各項目のkeydownイベントでキーコードを取得して、Aの場合 Enter(13)又は→(39)なら、Bへ ←(37)なら、Cへ 移動するようにキーコードを取得して移動するようにしました。 IEだと問題なく動くのですが、Firefoxだと、矢印キーで移動した時に、移動先のセレクトボックスの値が  ←で動いた場合、セレクトボックスの値が1つ前  →で動いた場合、セレクトボックスの値が1つ後 に変わってしまいます。 (フォーカスは問題なく移動先のセレクトボックスにあります) 移動した後(例えばB.focus()の後)に、まだキーイベントが残っていて、Bにフォーカス移動後に、→キーが押されたような状態っぽいのです。 Firefoxの場合、セレクトボックスにフォーカスがある時、キーボードの左右で値を変更できるので、その辺りが原因と思うのですが、移動時に左右矢印キーのイベントを無効(?)にする事はできないのでしょうか? 雑な書き方で申し訳ありませんが、お詳しい方、是非ともご教授下さいm(__)m 宜しくお願い致します。

  • キーイベントを擬似的に発生させることは可能?

    JavaScriptのイベント処理で質問なのですが、 keydownなどのキーイベントを、実際にキーを押さずに擬似的に「このキーが押された」というイベントを発生させることは可能でしょうか? そもそも不可能ではと思っているのですが もしそういうテクニックがあるのならと思い質問させていただきました。 また、JavaScriptでは無理だがFirefoxのアドオンなら可能といった情報があればぜひ教えていただきたいと思います。

  • KeyDownイベントで数字以外は発生しません。なぜでしょうか。

    KeyDownイベントで数字以外は発生しません。なぜでしょうか。 電卓を作っているのですが、キーボードからの対応をしているさなか大きな壁に当たりました。 フォームのKeyDownイベントでキーボードからの入力をキャッチする。 数字や演算、エンターキー。 フォームには、電卓を作るのに必要なボタンなどの配置はしてあります。 数字を表示する部分はLabel1にしています。 試験的に下記のソースで実験したところ、テンキーの数字以外、例えば演算キーをキーボードから入力すると、下記のソース通りならば、○算と表示されるはずです。しかし、なぜか数字と表示されます。 つまり、演算キーを押したにも関わらず、数字が入力されたとして処理されたということです。 なぜでしょうか。 そして、試験的にそれぞれが入力成功した時はLabelに表示されるようにしました。 Private Sub Form6_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown //↓エンターキーが押されたとき If e.KeyCode = Keys.Enter Then Label1.Text = "Enter" //↓演算キー及び点が入力されたとき ElseIf &H6A <= e.KeyCode <= &H6F Then Select Case e.KeyCode Case &H6A Label1.Text = "乗算" Case &H6B Label1.Text = "加算" Case &H6D Label1.Text = "減算" Case &H6E Label1.Text = "小数点" Case &H6F Label1.Text = "除算" End Select End If //↓delキーが押されたときの場合 If e.KeyCode = Keys.Delete Then Label1.Text = "Del" End If // ↓は数字1から9までが対象に入ります。 If &H60 <= e.KeyCode <= &H69 Then   Label1.Text = "数字" End If End Sub keycode表はマイクロソフトのキーコード定数を見て作りました。 僕がお伺いしたいのは、これらすべてを正常に対応させたいわけです。 数字、演算キー、その他のキーボード入力が正常にできるようにしたいのですが、どうもうまくできません。 なせかずべて数字ほうに行ってしまいます。これでは話にならないので、対処法はありませんか? 環境は Win7 Ultimate 64bit Visual Studio 2010 (VB) です。 何卒、よろしくお願い申し上げます。

  • jsでキーボード入力は同時にできますか?

    let EEvent = new KeyboardEvent( "keydown", { keyCode: 40 }); let CEvent = new KeyboardEvent( "keydown", { keyCode: 17 }); document.dispatchEvent( EEvent ); completion(); これだと片方しか発生させられないのですが同時に入力判定を出すスクリプトはありますか?

  • C# でIME の状態を知るには?

    VisualStudio 2010 C# form アプリケーションです。 テキストボックスの内容(キーワード)で検索するプログラムを作りました。リターンキーを押す度に候補に順にスクロールします。 KeyDown イベントでe.KeyCode == Keys.Return でリターンキーを拾っています。 ところでIME で漢字入力中に確定でリターンキーが押されますが、それだと変換途中の場合もある訳です。もちろんIME のボックスでのリターンキーですから、テキストボックスには飛んでこないと思っていたのですが・・・どうやらリターンキーが押されたという事でイベントが発生してしまいます。 変換途中でのリターンキーには反応させたくないのです。なにか手がありますか?

  • テキストボックスのキーイベントについて

    VS2005を使用して勉強中の初心者です。 今、勉強を兼ねて実験的に作成しているアプリにおいて 「TextBox1にフォーカスがある時 エンターキーを押すことでメッセージボックス"TEST"を表示させる」 ということをさせようと考えています。 以下のようなイベントプロシージャによって、 一応目的の動きをさせることはできましたが この時、エンターキー押下による改行を入力させずに メッセージボックス表示のみを実行させるには どのように書き直すべきなのでしょうか。 よろしくお願い致します。 Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) If e.KeyCode = Keys.Enter Then MsgBox("TEST") End If End Sub

専門家に質問してみよう