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

このQ&Aのポイント
  • KeyDownイベントで数字以外は発生せず、演算キーなどの入力でも数字が表示されてしまいます。どうすれば正常に対応できるのか悩んでいます。
  • 質問者は電卓アプリを作成中で、キーボードからの入力をキャッチするためにフォームのKeyDownイベントを使用しています。ただし、数字以外の入力が上手く認識されず、演算キーを押しても数字が表示されるという問題が発生しています。
  • 質問者はVBのVisual Studio 2010を使用しており、Win7 Ultimate 64bitの環境で開発を行っています。全てのキーボード入力(数字、演算キー、その他)を正常に対応させる方法を教えてほしいとのことです。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.1

IF 文を通過するかどうかの前に、受け取ったキーコードの値を確認しましょう。

yangxun38
質問者

補足

受け取ったキーコードの値を確認したところ、それぞれ正しくキーコードが送られているようです。 数字0~9のキーコードは96~105の間です。 しかし、エンターキーのキーコード13が送られると、数字の96~105のキーコードに入ってしまい、意味が分かりません。 キーボードのアルファベットのA~Zやシフトなどの全てのキーを押しても数字に入ってしまいます。 msgboxで受け取ったキーを表示するようにしたところ、キーはそれぞれ対応しています。つまり、間違ったキーコードが送られているということはありません。それどころが、IFが通らないということです。条件判断が出来ていないのがおかしいです。どうしたらいいでしょうか?

その他の回答 (1)

回答No.2

Dim x As Integer = 100 If 5 <= x <= 90 Then System.Console.WriteLine("HOGE") End If ★このコード断片が意味するところを考えてみましょう。 まず、手前の二つが比較されます If (5 <= 100) <= 90 Then System.Console.WriteLine("HOGE") End If で、こうなります。 If True <= 90 Then System.Console.WriteLine("HOGE") End If BooleanとIntegerは直接比較できないので、 比較するために一方を直します。調べてないけど、多分 Trueは1でしょう。…注1 If 1 <= 90 Then System.Console.WriteLine("HOGE") End If よって If True Then System.Console.WriteLine("HOGE") End If となります。 ★xが5以上90以下であるときだけHOGEと表示させるにはこう書きます。(演算子の優先順位があるので多分、カッコで括らなくて大丈夫だと思う) x = 100 If (5 <= x) And (x <= 90) Then System.Console.WriteLine("HOGE") End If これなら If True And False Then System.Console.WriteLine("HOGE") End If で If False Then System.Console.WriteLine("HOGE") End If と出来ます。 =========== ところで… ★VB6からの人はOption Explicitというのがあるのをご存知かも。こいつはVB.NETでも健在です。 http://d.hatena.ne.jp/juku-cho/20090415/1239752983 ★VB.NETでは、さらに、Option Strict Onというのもあります。 注1のような自動変換が行われるコードを書いた場合コンパイルエラーになってくれます。 http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp04_OptionStrictOn.html ☆VB6の話だけど、上記が理解できたあと、余力があれば、以下、最初の2ページに渡る記事読んでおくといいでしょう。 (英語だけど、眺めているだけでも論旨わかるとおもう) http://vb.mvps.org/articles/pt199511.pdf を読んでみるのも面白いでしょう。 ★列挙体と整数って比較できるんだ…へぇ(おぃ

関連するQ&A

  • VB2008KeyDownの使い方が分かりまんせん

    VB2008 KeyDownの使い方も含め良く分かりません If e.KeyCode = Keys.Down Then e.KeyCode = 40 End If で実行すると、 「エラー 1 プロパティ 'KeyCode' は 'ReadOnly' です。」 とエラーが出ます。 何故エラーが出るのでしょうか?

  • 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

  • 【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」キーを押しても無反応でした。 方法を教えていただければ幸いです。

  • Keydownイベントについて

    VB6.0について質問です。 FormでKeydownイベントが動きません。 どのような原因が考えられますか? コードは以下のように記述しています。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyF8 cmd_F8.Value = True Case vbKeyF9 cmd_close.Value = True End Select End Sub

  • 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; }

  • 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イベントが機能しない

    エクセル2003を使用しています。 フォームを表示中に、エスケープキーを押したらフォームを閉じたいのですが KeyDownイベントが反応しません。 http://homepage1.nifty.com/tsware/tips/tips_251.htm を見てやってみたのですが 新ブックに新規フォームを挿入し、 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyEscape Then Unload Me End If MsgBox "" End Sub と記載し、フォームを実行しエスケープキーを押してみました。 しかし何も起こりません。 実験用のMsgBoxも表示されません。 「エスケープキーを押したらフォームを閉じる」以前に、 KeyDownイベントが反応しないのですが 何が原因なのでしょうか? 新ブックを作ってテストしているので 余計な動作に邪魔されていないと思います。 ご指摘よろしくお願いします。

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

    テキストボックスにフォーカスがあり、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ににするってどういうことでしょうか?

  • データグリッドビュー数字と小数点は入力可能

    VB2010にて、データグリッドビューを編集不可にしています。 数字と小数点は入力可能にしたいのですが、 下記のコードを実行すると、 1キーを押すと49と表示されます。 どうしたら、キー値を表示できるようになるのでしょうか? ご存知の方教えてください。よろしくお願いします。 Private Sub DataGridView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown '数字と小数点は入力可能 If e.KeyCode >= Keys.D0 And e.KeyCode <= Keys.D9 Or e.KeyCode >= Keys.NumPad0 And e.KeyCode <= Keys.NumPad9 Or e.KeyCode = Keys.Decimal Or e.KeyCode = 190 Then e.Handled = True strTemp = Me.DataGridView1(Me.DataGridView1.SelectedCells(0).ColumnIndex, Me.DataGridView1.SelectedCells(0).RowIndex).Value strTemp = strTemp & e.KeyValue Me.DataGridView1(Me.DataGridView1.SelectedCells(0).ColumnIndex, Me.DataGridView1.SelectedCells(0).RowIndex).Value = strTemp End If 'バックスペース機能追加 If e.KeyCode >= Keys.Back Then e.Handled = True strTemp = Me.DataGridView1(Me.DataGridView1.SelectedCells(0).ColumnIndex, Me.DataGridView1.SelectedCells(0).RowIndex).Value If strTemp = "" Then Exit Sub strTemp = Microsoft.VisualBasic.Left(strTemp, Len(strTemp) - 1) Me.DataGridView1(Me.DataGridView1.SelectedCells(0).ColumnIndex, Me.DataGridView1.SelectedCells(0).RowIndex).Value = strTemp End If If e.Control And e.KeyCode = Keys.V Then 'Ctrl+V押下時は貼付 DGV.Paste(DataGridView1) ElseIf e.KeyCode = Keys.Delete Then 'Delete押下時は削除 DGV.Delete(DataGridView1) End If End Sub

専門家に質問してみよう