• ベストアンサー

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

chie65535の回答

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

>if (f & BCTRL_A) { >これで「押され続けている」という判定になる理由が良く分かりませんでした。 その直前に if ((Key == 'A') && (f & (BKEY_CTRL | BMOUSE_CTRL))) { がありますね。 これは「押されたキーがAで、Ctrlキーを押していたフラグが付いている時」に成り立ちます。 その次の if (f & BCTRL_A) { が成り立つのは「Ctrl+Aを押したとのフラグが、もう既に付いていた時」です。 このフラグはOnKeyUpで消される筈なので、通常であれば「OnKeyDown(フラグ付く)⇒OnKeyUp(フラグ消える)⇒OnKeyDown(フラグ付く)⇒OnKeyUp(フラグ消える)…」の順にイベントが起こり「OnKeyDownに来た時はフラグが付いてない筈」です。 しかし、キーリピートが働くとOnKeyDownだけが連続で発生します。 そのため「OnKeyDownが2度以上続けて起きた時」には「2度目のOnKeyDownに来た時には、1度目のOnKeyDownで付けておいたフラグが、付いたままになっている」のです。 従って if (f & BCTRL_A) { は「キーリピートが始まって、2度以上連続してOnKeyDownに来た時」に成り立ちます。 「キーリピートが始まって、2度以上連続してOnKeyDownに来た時」とは「押され続けている時」の事です。 そして、このif文の判定が終われば、もう1度目か2度目以降なのか気にしなくて良いので f |= BCTRL_A; を行って、フラグを付けています。 簡単に言えば「フラグを付ける前に、もう既にフラグが付いてたのなら、2回連続でフラグを付けようとしたって事」です。

CLMN
質問者

お礼

回答ありがとうございました。 まず、本題から...。 Ctrl + A が押されたか?という判定で、 if(Shift.Contains(ssCtrl) == true && Key == 'A'){ というif文では不十分でしょうか? この判定直後でMessageBoxを表示し、「***の処理をしても良いですか」という記述をした場合に、Crtl + A が連続して押される、という状況は免れると思います。 それでもchie65535さんがおっしゃる記述をしないと危険でしょうか? ButtonのMouseDownとClickを組み合わせなさい、という話は良く分かりました。 それから、この例では、ボタンのTagにはゼロが格納されている、という前提なのですよね? 次に脱線の話題で...。 if ((Key == 'A') && (f & (BKEY_CTRL | BMOUSE_CTRL))) { このif文とビット操作が良く分からないのです。 BKEY_CTRLは0x01なので、  0000 0001 BMOUSE_CTRLは0x08なので、 0000 1000 BCTRL_Aは0x40なので、   0100 0000 最初の二つと、最終的に判定しているBCTRL_Aはビットの位置が違うのでは?と混乱しています。 この辺の話はC言語の初心者向けの話題かもしれません。 (f & (BKEY_CTRL | BMOUSE_CTRL)) を日本語で説明してくれると分かるかも知れません。

関連する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; } } }