質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

7200閲覧

C++でキーの押し離しを検出したい

minimize

総合スコア23

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/12/23 19:39

編集2018/12/23 19:40

質問失礼します。いまC++でキーボードの押し離しを検出しようと試みています。
キーを押すことは認識できたのですが、
離す時の処理が思いつかなかったので、知恵を貸していただけると幸いです。
ちなみに複数のキーを取得できたらいいなと思っています。
よろしくお願い致します。

C

1#include "input_data.hpp" 2 3using namespace std; 4 5array<float, 10> input_time; 6array<string, 10> input_button; 7 8int Csv_input(array<string, 10> input_button, array<float, 10> input_time){ 9 10 ofstream ofs("input_button.csv"); 11 12 if(!ofs){ 13 cout << "ファイルが書き込めません" << endl; 14 return -1; 15 } 16 17 for( int i = 0; i < input_button.size(); i++){ 18 ofs << input_button[i] << "," <<input_time[i] << endl; 19 } 20 return 0; 21} 22 23string input_key(char input){ 24 string button_code; 25 26 if(input == 0x4D) button_code = "VK_LEFT"; 27 if(input == 0x48) button_code = "VK_UP"; 28 if(input == 0x4B) button_code = "VK_RIGHT"; 29 if(input == 0x50) button_code = "VK_DOWN"; 30 31 if(input == 'a') button_code = "A"; 32 if(input == 's') button_code = "S"; 33 if(input == 'd') button_code = "D"; 34 if(input == 'w') button_code = "W"; 35 36 cout << "input : " << input << endl; 37 cout << "button : " << button_code << endl; 38 return button_code; 39} 40 41int main(void){ 42 43 int j = 0; 44 string input_key_code; 45 clock_t start, end; 46 start = clock(); 47 int c; 48 49 char input = 0; 50 char before_input; 51 52 53 while(1){ 54 55 if(j >= 10){ //終了の条件 56 //Csv_input(inputButton); //csvに保存する 57 Csv_input(input_button, input_time); 58 break; 59 } 60 61 if(c = kbhit()){ //入力があったら 62 63 input = getch(); //キーの取得 64 cout << "input :" << input << endl; 65 if(input == 0xFFFFFFE0){ 66 input = getch(); //特殊キーの場合 67 } 68 if(input == before_input){ //同じボタンを押し続けていたら 69 70 }else if(input != before_input){ //以前と違うボタンを押したら 71 72 input_key_code = input_key(input); //キーコードへの変換 73 cout << "input_key : " << input_key_code << endl; 74 end = clock(); 75 input_button[j] = input_key_code; //入力ボタンの保存 76 input_time[j] = end; //時間の保存 77 j++; 78 79 } 80 81 before_input = input; //以前入力していたボタンを保存 82 83 }else{ 84 before_input = 0; 85 } 86 87 Sleep(1000); //0.1ms待つ 88 } 89 cout << "終了したよ"<< endl; 90 91 return 0; 92}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Cの標準関数では、キーの押し離しを検出できるような関数は用意されてません。
Windows、Linuxなど環境それぞれのAPIにそれが取れるようなモノが用意されているのでそれを使うというテになりますね

投稿2018/12/23 22:50

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Windowsの場合、一つのキーならGetKeyState、全部のキー状態であればGetKeyboardState関数が使えるかもしれません。

ENTERキーの状態を調べるサンプル:

cpp

1#include <Windows.h> 2 3int main(void) { 4 5 while (1) { 6 Sleep(500); 7 printf("ENTER: %d\n", (GetKeyState(VK_RETURN) & 0x8000) > 0); 8 } 9 10 return 0; 11}

離したかどうかを判定するには、
「前回押されていたかを記憶しておいて、前回オン→今回オフならば『離した』」
で一応判別できます。

投稿2018/12/24 00:20

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

環境が書いてないので憶測ですが、Windows環境ならwindows.hをincludeすると仮想キーコードが定義されます。その中にWM_KEYUP(キーが離された)というのが有ります。記事が古いような気もしますが一週間で身につくWIN32プログラミングの基本を参考に。

投稿2018/12/23 21:54

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問