C#のKeyDownイベントで電卓のEnterキーがクリックされない理由と解決方法

このQ&Aのポイント
  • C#のKeyDownイベントを使用して電卓を作成している初心者が、Enterキーがクリックされない問題に遭遇しています。他のキーボードのキーは正常に動作しているが、Enterキーだけがフォーカスされたボタンがクリックされた状態になってしまいます。この問題を解決する方法について教えてください。
  • 質問者が作成したプログラムは、KeyDownイベントでキーボードのキーごとに処理を行っています。数字キー、+、-、*などは正常に動作しているが、Enterキーだけが問題となっています。フォーカスを設定することでEnterキーの動作を正常化する方法を教えてください。
  • Enterキーによるフォーカスの移動やボタンのクリックを実現するためには、KeyDownイベントではなくKeyPressイベントを使用する必要があります。KeyPressイベントを使用することで、Enterキーが正しく動作するようになります。具体的なコードの修正方法について教えてください。
回答を見る
  • ベストアンサー

C#のKeyDownイベント?で

プログラムやり始めたばかりの初心者です。 電卓を作ってみようとやっているのですが、 一応ボタンを押しては動くようになりました。 キーボードからも入力できるようにKeyDownで設定したのですが 数字キー、+ - * /などは反応するのですがEnterキーだけは フォーカスされてるボタンがクリックされた状態になってしまいます。 どのようにすればよいのでしょうか? プログラムはこんな感じです! private void Form1_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.D1: case Keys.NumPad1: this.button_1.Focus(); this.button_1.PerformClick(); break; case Keys.D2: case Keys.NumPad2: this.button_2.Focus(); this.button_2.PerformClick(); break; . . . case Keys.Enter: this.button_kei.Focus(); this.button_kei.PerformClick(); break; }

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

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

お返事有難うございます。 見事にはずしました。すいません。 >押す時にはその前の3のボタンにフォーカスされてて押された時にその3も押されたと反応しているようなんです この現象が私の元では確認できませんので、未検証の話でスイマセンが ActiveControlで現在のアクティブコントロールが取得できますので、そのコントロールをよければいいのかな~ 別のサンプルです、上記は考慮していません。足し算のみです。 private void Form1_Shown(object sender, EventArgs e) { this.KeyPreview = true; } int ansadd;//足し算の変数 private void Form1_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.D1: case Keys.NumPad1: this.button_1.Focus(); this.button_1.PerformClick(); ansadd += 1;//押されたボタンがD1の時は1を足す break; case Keys.D2: case Keys.NumPad2: this.button_2.Focus(); this.button_2.PerformClick(); ansadd += 2;//押されたボタンがD2の時は2を足す break; case Keys.D3: case Keys.NumPad3: this.button_3.Focus(); this.button_3.PerformClick(); ansadd += 3;//押されたボタンがD3の時は3を足す break; case Keys.D4: case Keys.NumPad4: this.button_4.Focus(); this.button_4.PerformClick(); ansadd += 4;//押されたボタンがD4の時は4を足す break; case Keys.D5: case Keys.NumPad5: this.button_5.Focus(); this.button_5.PerformClick(); ansadd += 5;//押されたボタンがD5の時は5を足す break; case Keys.Add://足し算だけですので、今回は置いてあるだけ this.button_tasu.Focus(); this.button_tasu.PerformClick(); break; } } //Enterキーが押されたとき private void Form1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) { this.button_kei.Focus(); this.button_kei.PerformClick(); //足し算のみ textBox1.Text = ansadd.ToString(); e.Handled = true; } } //クリア private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; ansadd = 0; } }

kutusita3
質問者

お礼

また、回答していただきありがとうございます! こちらこそすいません>< やってみましたらEnterを押した時に変な数字が出ますが、話したときにそれが上書きされる感じで正しい表示がでました! ちゃんと見直せばなんとかいけそうなきがします。 お付き合い頂きありがとうございましたー! 見直してみてダメだったら、またお願いするかもわかりませんが、その時はよろしくお願いしますorz

その他の回答 (1)

回答No.1

こんばんは >Enterキーだけは >フォーカスされてるボタンがクリックされた状態になってしまいます。 すいません、上記の意味がわかっていません。 普通EnterキーはKeyDownは使いませんので、Enterキーだけ別のイベントハンドラーに記載したサンプルを作成しました。 private void Form1_Shown(object sender, EventArgs e) { this.KeyPreview = true; } private void Form1_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.D1: case Keys.NumPad1: this.button_1.Focus(); this.button_1.PerformClick(); MessageBox.Show("1"); break; case Keys.D2: case Keys.NumPad2: this.button_2.Focus(); this.button_2.PerformClick(); MessageBox.Show("2"); break; case Keys.Enter: this.button_kei.Focus(); this.button_kei.PerformClick(); break; } } private void Form1_KeyUp(object sender,KeyEventArgs e) { if (e.KeyData ==Keys.Enter ) { this.button_kei.Focus(); this.button_kei.PerformClick(); MessageBox.Show("kei"); e.Handled = true; } } 外してましたらすいません。

kutusita3
質問者

お礼

ご回答ありがとうございます! 早速追加させていただきました。 Enterキーは指定のボタンに反応するようになったのですが 例えば、 5+3= というのを入力したとして =をEnterに割り当ててるんですが、押す時にはその前の3のボタンにフォーカスされてて押された時にその3も押されたと反応しているようなんです>< そして答えが38になってしまいます。 Enterじゃなく直接=ボタンをクリックすると正常に8がでます。 Enterでボタンが押されるというのを無効にする事はできないでしょうか?

関連するQ&A

  • C#でKeyDownイベントが発生しない。

    VS2010 CS.NET 環境です。 Formにボタンが2個あり。ボタン1はF1キー、ボタン2はF2キーで動作するようにしています。 private void Form1_KeyDown(object sender, KeyEventArgs e) {    switch (e.KeyCode)    { case Keys.F1: this.btn1.PerformClick(); break; case Keys.F2: this.btn2.PerformClick(); break; } } ボタン1は計算処理をします。 ボタン2は別のForm2を開きます。 ボタン1はF1キーで何度でも動作しますが、ボタン2はF2キーでForm2を開いて、それを閉じて元のForm1に戻ると次のF2キーではKeyDownイベントが発生しません。 この時はF1キーもKeyDownイベントが発生しなくなります。 Form1のどこかをクリックすると、KeyDownイベントが発生するようになります。 別Formを開いて戻ってもKeyDownイベントを発生させるにはどうしたらいいでしょうか? よろしくお願いします。

  • 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) です。 何卒、よろしくお願い申し上げます。

  • access2003 KeyDown の意味

    access2003です。 あるフォームのイベントプロシジャーの中に     Private sub btn_×_KeyDown(KeyCode As Integer, Shift As Integer) というのがありました。 この「 KeyDown」というのは、どういう操作が行われたときに実行されるのでしょうか。 「btn_×」というボタンにフォーカスがあるときにEnterキーが押されたときと思って いいのでしょうか。 よろしくお願いします。

  • 【KeyDown】キーコードについて

    Visual Basic について質問です。 「KeyDown」「KeyUp」で、「キーを押した時、離した時に…」というプログラムが書けますよね。   Private Sub Form1_KeyDown(…省略) Handles Me.KeyDown     If e.KeyCode = Keys.A Then        …(1)     ElseIf e.KeyCode = Keys.B Then        …(2)     ElseIf e.KeyCode = Keys.D0 Then        …(3)     End If   End Sub こんな感じで、 「A」キーが押されたら処理(1)を実行 「B」キーが押されたら処理(2)を実行 「0」キーが押されたら処理(3)を実行 という風なプログラムを作っているのですが、 右の方にある「@」キーや、 カギカッコのキーや、 ひらがなの「れ」「け」「む」「ね」「る」「め」「ろ」のキーや、 ENTERキーの指定方法が分かりません。 このキーが使えないと、プログラムとして成り立たなくなってしまうので、非常に困っています。 ↓このページに、いろいろなキーの指定方法が書かれていましたが、   ttp://msdn2.microsoft.com/ja-jp/library/system.windows.forms.keys(VS.80).aspx どれがどのキーなのか分かりませんでした。 適当にそれらしい物でやってみましたが、どのキーを押しても反応無しでした。 「Enter」キーは、「Enter」で指定するように書かれていましたが、「Enter」キーを押しても無反応でした。 方法を教えていただければ幸いです。

  • KeyUpイベントにて

    テキストボックスのKeyUpイベントにて『Enter』または『Tab』が押されたら処理をさせようと Private Sub Text_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Text.KeyUp If e.KeyCode = Keys.Enter or e.KeyCode = Keys.Tab Then   処理コード End If End Sub としたのですが『Enter』のときしか処理コードが反映されません ご教授お願いします

  • 初歩的な質問ですみません。

    初歩的な質問ですみません。 テキストボックスのフォーカスを移す処理なんですけど、 Private sub Textbox1_Keydown以下略 if e.Keycode = Keys.Enter then Textbox2.Focus End sub これだとポンと音が鳴ってしまうのですが、 音が鳴らないようにするには、どうしたらいいのでしょうか? よろしくお願いします。

  • イベント内で別イベントを呼ぶ方法

    早速質問させていただきます。 Form上にDataGridView(dgv)があります。 dgvのセルをマウスでダブルクリックした時に処理を入れております。 Private Sub dgv_CellDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.CellDoubleClick   If e.RowIndex = -1 Then     Exit Sub   End If   '//処理 End Sub このdgv上でEnterキーを押した際に、ダブルクリックしたのと同じ処理を 行いたいのですが、このような場合、どのような実装をするのが一般的なのでしょうか? 例えば、下記の様にCall dgv_CellDoubleClick(sender, e)をするとEventArgsが合わないためエラーになってしまいます。 適切な方法をご教授お願い致します。 Private Sub dgv_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles dgv.KeyDown   If e.KeyCode = Keys.Enter Then     Call dgv_CellDoubleClick(sender, e)   End If End Sub

  • WM_KEYDOWNでPrtScを捕まえる方法??

    ごく普通のウィンドウプロシージャでキーの判別を行っています 下記のように条件(1)が WM_KEYUP の際には(2)、(3)ともに検出します LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_KEYUP: ............ (1) switch(wp) { case VK_RETURN: { break; } ..... (2) case VK_SNAPSHOT: { break; } ..... (3) default: { break; } } break; } return; ところが条件(1)を WM_KEYDOWN に変更すると(2)の Enter は検出しますが、(3)の PrtSc を検出してくれません 質問1 なぜ PrtSc を WM_KEYDOWN では検出しないのですか? 質問2 WM_KEYUP WM_KEYDOWN のいずれか一方にしか反応しないキーはまだありますか? 質問3 どのようにしたら PrtSc の WM_KEYDOWN を捕まえることが出来ますか? 自分でも調べてみましたが、どうも判然と致しません 宜しくご指導のほどお願い申し上げます

  • C#: キー判定からどのようにしてもとの繰り返しへ?

    VisualStudio2005のC#を使用しております。 現在、 テキスト1行ずつ読み込み⇒行中に"★"があるとキー入力待ち ⇒Enter押す⇒{処理}⇒ 元の文章の続きを読み込み・・・ という処理を行いたいのですが、Enterをおしたらそこで止まってしまいます。どうやら、元のテキストの読み込みに戻らないようです。 private void Form1_KeyDown(object sender, KeyEventArgs e) //Enterが押されたとき、EnterKeyDownが1でキー入力待ち、2で押した、0でなにもなしです。 { if (EnterKeyDown == 1) { if (e.KeyData == Keys.Enter) { EnterKeyDown = 2; } } } すべてを載せると多いので、キー処理の部分のみですが、なにかよい方法はないでしょうか?

  • VB6.0 KeyDownイベントの対応

    VB6.0を使ってプログラム中ですが、下記の  Command10_KeyDown で、複合キー「 Ctrl + ↓」 だとイベント KeyDown を受信できるのですが、単純な キー「↓」だと、イベント KeyDown を受信でず、他のボタンにフォーカスが移ってしまいます。 Comman10_GotFocus に何か対応策を入れて、単純な キー「↓」のイベント KeyDown を受信する方法はないでしょうか? Private Sub Command10_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 40 Then execsub001() End If End Sub Private Sub Commnad10_Click() execsub001() End Sub Private Sub Comman10_GotFocus() 上記問題への対応策を此処に記述したい End If Private Sub execsub110() 内容は省略 End Sub

専門家に質問してみよう