• ベストアンサー

コントロールキーが押されたキー入力の判定方法

chie65535の回答

  • ベストアンサー
  • chie65535
  • ベストアンサー率44% (8571/19473)
回答No.4

>VK_AやVK_0は「未定義」となって、コンパイルが通りません。 失礼。winuser.hを見ると /* VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */ /* VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */ と書いてあって、定義が無いようです。 自前のヘッダファイルに #define VK_0 0x30 #define VK_1 0x31 #define VK_2 0x32 #define VK_3 0x33 #define VK_4 0x34 #define VK_5 0x35 #define VK_6 0x36 #define VK_7 0x37 #define VK_8 0x38 #define VK_9 0x39 #define VK_A 0x41 #define VK_B 0x42 #define VK_C 0x43 #define VK_D 0x44 #define VK_E 0x45 #define VK_F 0x46 #define VK_G 0x47 #define VK_H 0x48 #define VK_I 0x49 #define VK_J 0x4A #define VK_K 0x4B #define VK_L 0x4C #define VK_M 0x4D #define VK_N 0x4E #define VK_O 0x4F #define VK_P 0x50 #define VK_Q 0x51 #define VK_R 0x52 #define VK_S 0x53 #define VK_T 0x54 #define VK_U 0x55 #define VK_V 0x56 #define VK_W 0x57 #define VK_X 0x58 #define VK_Y 0x59 #define VK_Z 0x5A などと定義しておくか if (Key == '0') とか if (Key == 'A') とか、直接、文字定数と比較すると良いでしょう。 定義が無い、って事は、直接'0'~'9'や'A'~'Z'と比較しても構わない、と言うことだと推測されます。 >Key == 0x79 はF10として認識されましたが、 >Key == 0x61 はaとして認識されませんでした。 仮想キーコードには大文字も小文字も区別がありません。 >従って、Ctrl + a が認識できない状態です。 もしかして「Ctrl+A」と「Ctrl+a」を「別のもの、違うものとして判定」したいのでしょうか? 上記の通り、英字キーは「すべて、大文字の'A'から'Z'に相当するコード」が割り当てられています。 なので「A」と「a」の区別はありません。同様に「Ctrl+A」と「Ctrl+a」の区別もありません。 そして、小文字の'a'から'z'に相当するコードには、以下のように「全然違うキー」が割り当てられています。 #define VK_NUMPAD1 0x61 #define VK_NUMPAD2 0x62 #define VK_NUMPAD3 0x63 #define VK_NUMPAD4 0x64 #define VK_NUMPAD5 0x65 #define VK_NUMPAD6 0x66 #define VK_NUMPAD7 0x67 #define VK_NUMPAD8 0x68 #define VK_NUMPAD9 0x69 #define VK_MULTIPLY 0x6A #define VK_ADD 0x6B #define VK_SEPARATOR 0x6C #define VK_SUBTRACT 0x6D #define VK_DECIMAL 0x6E #define VK_DIVIDE 0x6F #define VK_F1 0x70 #define VK_F2 0x71 #define VK_F3 0x72 #define VK_F4 0x73 #define VK_F5 0x74 #define VK_F6 0x75 #define VK_F7 0x76 #define VK_F8 0x77 #define VK_F9 0x78 #define VK_F10 0x79 #define VK_F11 0x7A 従って、OnKeyDownでは「A」と「a」は単純には区別できません。同様に「Ctrl+A」と「Ctrl+a」も単純には区別できません。 小文字が入力されたのか大文字が入力されたのかは、以下のように判定します。 ・他のAPI関数でCapsLockの状態を調べて、CapsLockがオフの場合 「A」の判定:Shist.Contains(ssShift)が真、かつ、Keyが0x41('A') 「a」の判定:Shist.Contains(ssShift)が偽、かつ、Keyが0x41('A') ・他のAPI関数でCapsLockの状態を調べて、CapsLockがオンの場合 「A」の判定:Shist.Contains(ssShift)が偽、かつ、Keyが0x41('A') 「a」の判定:Shist.Contains(ssShift)が真、かつ、Keyが0x41('A') このように、CapsLockがオンかオフか、AltやCtrlやShiftキーが一緒に押されているかどうかに関わらず「Aの文字が刻印されたキーの仮想キーコードは常に0x41('A')」なので、色々と面倒な判定が必要です。 もし「Ctrl+AやCtrl+a」を調べたいなら「Ctrlキー以外の特殊キーが一緒に押されていたら、どう扱うか」も考えなければなりません。 例えば Ctrlキーだけ+A⇒○ Altキー+Ctrlキー+A⇒× Shiftキー+Ctrlキー+A⇒× Altキー+Shiftキー+Ctrlキー+A⇒× のようにしたいなら、AltキーとShiftキーの状態も判定しないとならないでしょう。

CLMN
質問者

お礼

すばらしい!ありがとうございました。 今まで全然気が付かなかったのですが、OnKeyDownイベントでは、 Key == 'a'は認識しないのですが Key == 'A'は認識するのですね! 大文字小文字の区別は必要ありません。 このキーが認識されれば良いのです。 if(Shift.Contains(ssCtrl) == true && Key == 'A'){ 以下略 これで希望通りになりました。 大文字小文字を区別する例も良く分かりました。 (CapsLockを調べたり、結構面倒ですね。) この回答で充分なのですが、ついでにもう一つ知っていたら教えて欲しいことが出来ました。 ボタンをクリックした時に、コントロールキーやシフトキーが押されているか、という判定は出来ますか? 単純には、ボタンのOnKeyDownイベントに同様の記述をすれば良いと思うのですが、ボタンにフォーカスがあるときは、Ctrlキーを押した段階で反応してしまいます。(当然と言えば当然ですが・・・。) 元々、Windowsの仕様にないことならあきらめますが、可能でしょうか?

CLMN
質問者

補足

下の「お礼」の追加です。 ボタンを押したときに、Ctrlキーを判定するには、 Button1MouseDownイベントで判定すれば良さそうですね。 よく確認せずに思いつきの質問をしてしまい申し訳ありませんでした。 おかげさまでとても役に立ちました。

関連するQ&A

  • Tabキーのキャンセル

    かなり短期間にこちらでいくつも質問して しまっていて申し訳ないのですが、 どうにも他で回答を調べられず…(<力不足) と言う訳で、しつこく 「IEだけでなくNetscape6以降でも動かしたい」 処理についてお聞きいたします。 IEでは上手く動いてますが、Netscape6以降でTabのキャンセルは指定できるのでしょうか? ちなみに↓のNetscape用関数は動きません(……。) 必要そうな所だけ書き出します↓ function document_onLoad() {  // IE 4以降の場合  if (isIE)  {   // 各種イベントハンドラーの初期化   document.onkeydown = document_onKeyDownIE;  }  // N6,7の場合  if (isN6)  {   window.onkeydown = document_onKeyDownN6;  } } /// tabキーが入力されたときのイベント処理(IE用) function document_onKeyDownIE() {  // TABキー  if (event.keyCode == 9)  {   // 本来のtabの処理をキャンセルする。   event.returnValue = false;  }  return; } /// tabキーが入力されたときのイベント処理(NN用) function document_onKeyDownN6(evt) {  var keyCode = evt.which;  if (keyCode == 9)  {   // 本来のtabの処理をキャンセルする。   evt.returnValue = false;   evt.cancelBubble = true;  }  return; }

  • 「何も処理をしない」を実装する方法

    キーボードのEnterキーを押した際、 何も処理をせず現在表示している画面に戻す ということを実装したいのですが、どのように記述したらよいのか分かりません。 私が作りましたソースは、 window.document.onkeydown = keytech; function keytech(){ if( event.keyCode == 13 ){   history.go(0); }else {   // Nothing } です。 このソースで「Enterキー」を押した時というイベントは取れています。 しかし、「history.go(0);」にて、 「現在表示しているページを再度読み込む」をしてしまいます。 それでは、これまでに入力したフォームのテキストの情報などが、 消えてしまいます。 入力してもらった情報を消さずに何も処理をしないということは可能でしょうか?

  • Internet Explorerのキー入力受付

    お世話になります。 例えば、 googleのサイトを開いて、検索ワードを自動で打ち込むようなプログラムを作ろうとしているのですが、 googleを立ち上げ,keybd_event()で打ち込もうとしているのですが、 googleがキー入力を受け付け可能か否かが分からないため、上手くいきません。 キー入力の受付可能かどうかの判定の仕方を教えてください。

  • テキストフィールドに半角数値以外入力させない方法…。

    お世話になります! JavaScriptで、 function checkNum() {  c = String.fromCharCode(event.keyCode);  if ("0123456789".indexOf(c,0) < 0) alert("数値以外入力できません"); } と記述し、実行してみたのですが確かに数値以外は入力できないのですが BackSpaceやEnterキー、Tabキーを押した時にもアラートが発生します…。 本を見て、 function checkNum() {  c = String.fromCharCode(event.keyCode);  if ("0123456789".indexOf(c,0) < 0) return false; return true; } と記述すると、フォーム自体に半角数字しか入力できなくなると書いてあったのですが 実行しても普通に全角入力できました…。(泣) 何か方法ありますか?ご存知の方、宜しくご教授願います★ ちなみに、勿論<input>部分にonKeyDown="***()"の記述はしてますし JavaScriptが有効な状態での実行です。

  • キーコードなどでAlt+○を認識してイベントを発生させるには?

    キーコードなどでAlt+○を認識してイベントを発生させるにはどうしたらよいのでしょうか?ひとつのキーでならできたのですが複数のキーを組み合わせることができませんでした。参考までにうまくいかなかったプログラムの関数部分を記述しておきます。このプログラムだと一回目はうまくいくのですが二回目になるとsキーを押すだけで実行されてしまいます。 document.onkeydown=keyDown; function keyDown() { keynum1=event.keyCode; if(keynum1==18)//この番号がキーに対応してる(Altキー) { document.onkeydown=pressEnter; } } function pressEnter() { keynum2=event.keyCode; if(keynum2==83)//この番号がキーに対応してる(sキー) { document.write("キーコード"); } }

  • キーコード ?と/が同じですが、区別する方法は

    onkeydownで取得するキーコードが、?と/が同じ191で困っています。 ?が入力されたときに処理を実行し、/が入力された時は処理を実行したく無いのですが、どうすれば良いでしょうか? function hoge() { if(event.keyCode == 191) 処理; } <INPUT type=text id=txt1 name=txt1 onkeydown=hoge() > 宜しくお願い致します。

  • 入力判定の仕方が分からなくて、困ってます・・

    VB.NETで、キーボードから入力してLabelに表示されている文字と 合っていれば正解、間違っていれば不正解の処理を1文字単位でやりたいのですが、正解不正解の判定のやり方が分かりません・・。 Private Sub Form1_KeyPress() If Mid(Label2.Text, a, 1) = "入力したのと同じ" Then Mid(Label2.Text, a, 1) = ""     a = a + 1 Else  ’不正解の処理 ?? End If End Sub みたいかな?と思ってプログラムを組んでみたのですが、 ifの"入力したのと同じ"ところの書き方が良く分かりません。 詳しい方、KeyPressの使い方等教えていただけませんか?

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

    Flashのキーイベント処理でなかなか不具合が取れず、困っています。 よろしくお願いします。 今作っているFlashは1つのデータ内に複数のページが存在し、ページごとにキーイベント処理内容が異なる仕様のため、それぞれにキー処理を行っています。 内容は、下のようなスクリプトを書いています。 -<ページ(1)でのクリアキー判定>---------------- var Key_object = new Object(); Key_object.onKeyDown = function(){ code = Key.getCode(); if(code == 46){ //終了処理 } } Key.addListener(Key_object); ----------------------------------------------- -<ページ(2)でのクリアキー判定>---------------- var Key_object2 = new Object(); Key_object2.onKeyDown = function(){ code2 = Key.getCode(); if(code2 == 46){ //ページ(1)へ戻る処理 gotoAndPlay("page1"); } } Key.addListener(Key_object2); ----------------------------------------------- ですが、上の処理だとページ(2)でクリアキーを押した時にページ(1)に戻ってほしいのに、何故かページ(1)のクリアキー判定まで行われてしまい、終了処理がなされてしまいます。 この件についての原因と打開策が知識の乏しい私では見当たりません。 また、違う人に聞いたところ「ページ(2)でのクリアキー判定の方はイベントリスナーを使わずにキー判定を実装して」といわれました。 このイベントリスナーを使わずにクリアキーの判定を実装する方法がわかりません。 どなたか、上のスクリプトでの不具合原因や打開策、また「イベントリスナーを使わないクリアキーの判定方法」が分かる方、いらっしゃいませんでしょうか?

    • ベストアンサー
    • Flash
  • カレンダーの年月入力の判定

    現在C言語でカレンダープログラムを書いています。 表示させたい年月を入力するのですが、正しい形で入力されたかの判定プログラムについてご教授いただきたいです。 具体的にはYYYY/MMまたはYYYYMMの形で入力されたかどうかを判定したいと思っています。 どのようなプログラムを書けばよろしいでしょうか。

  • Processingでのキーの同時入力

    Processingでゲームを作ろうとしているのですがキーボードの同時入力がうまくいきません。 例えば下記のようなキー入力に応じて黒い四角が動くプログラムを実行しました。方向キーを一つだけ押したときはサクサク動いてくれるのですが、→と↓を同時に押しても斜めに進んでくれません。また、→と←を押した場合もどちらか片方の方に動いてしまいます。 このような問題を解決したいので、Processingでキーボードの同時入力を判定するにはどのようにすればいいのか教えてください。 float x, y; void setup(){ size(400, 400); noStroke(); smooth(); } void draw() { background(255,255,255); fill(0,0,0); rect(x,y,20, 20); if (keyPressed && key == CODED){ if (keyCode == LEFT){ x -= 2; } if (keyCode == RIGHT){ x += 2; } if (keyCode == UP){ y -= 2; } if (keyCode == DOWN){ y += 2; } } }