![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
GetKeyboardStateでキー入力を受け取って、その後どのキーが押されたかで処理をしているのですが、例えはESCキーが押されたら終了という処理をしているのですが、ESCキーを押しても反応せず、カーソルキーで移動する処理も反応しません。教えてGOO!
/**************/
/* main.c */
/* メイン関数 */
/**************/
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include "color.h"
#include "console.h"
#define SIZE_X 160
#define SIZE_Y 50
struct strDrawData {
char c;
WORD fore;
WORD back;
};
struct strDrawData NowDD[SIZE_Y][SIZE_X],
EditDD[SIZE_Y][SIZE_X];
BYTE Key[256];
void NowDDInit(void);
void EditDDInit(void);
void DrawData(void);
int main(void) {
int pos_x, pos_y;
if (ConsoleInit(SIZE_Y, SIZE_X) == -1) {
fprintf(stderr, "コンソールの開始に失敗しました。\n");
return -1;
}
NowDDInit();
EditDDInit();
pos_x = 0;
pos_y = 0;
while (1) {
/* キー入力チェック */
GetKeyboardState(Key);
/* キー入力判定 */
if (Key[VK_ESCAPE] & 0x80)
break;
if (Key[VK_UP] & 0x80) {
EditDD[pos_y][pos_x].c = ' ';
pos_y -= 1;
if (pos_y < 0)
pos_y = 0;
EditDD[pos_y][pos_x].c = '@';
}
if (Key[VK_DOWN] & 0x80) {
EditDD[pos_y][pos_x].c = ' ';
pos_y += 1;
if (pos_y >= SIZE_Y)
pos_y = SIZE_Y - 1;
EditDD[pos_y][pos_x].c = '@';
}
if (Key[VK_LEFT] & 0x80) {
EditDD[pos_y][pos_x].c = ' ';
pos_x -= 1;
if (pos_x < 0)
pos_x = 0;
EditDD[pos_y][pos_x].c = '@';
}
if (Key[VK_RIGHT] & 0x80) {
EditDD[pos_y][pos_x].c = ' ';
pos_x += 1;
if (pos_x >= SIZE_X)
pos_x = SIZE_X - 1;
EditDD[pos_y][pos_x].c = '@';
}
/* 描画 */
DrawData();
}
return 0;
}
void NowDDInit() {
int x, y;
for (y = 0; y < SIZE_Y; y++)
for (x = 0; x < SIZE_X; x++) {
NowDD[y][x].c = ' ';
NowDD[y][x].fore = WHITE;
NowDD[y][x].back = BLACK;
}
}
void EditDDInit() {
int x, y;
for (y = 0; y < SIZE_Y; y++)
for (x = 0; x < SIZE_X; x++) {
EditDD[y][x].c = ' ';
EditDD[y][x].fore = WHITE;
EditDD[y][x].back = BLACK;
}
}
void DrawData(void) {
int x, y;
for (y = 0; y < SIZE_Y; y++)
for (x = 0; x < SIZE_X; x++)
if (EditDD[y][x].c != NowDD[y][x].c || EditDD[y][x].fore != NowDD[y][x].fore || EditDD[y][x].back != NowDD[y][x].back) {
NowDD[y][x] = EditDD[y][x];
DrawChar(y, x, NowDD[y][x].fore, NowDD[y][x].back, NowDD[y][x].c);
}
}
No.1ベストアンサー
- 回答日時:
コンソールでGetKeyboardState()は…微妙に鬼門なような。
状態変化はメッセージキューの変化時。という情報もあります。
https://tomoemon.hateblo.jp/entry/20071118/p2
10年以上前のネタなので、現在でも適用するのか…
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwln …
さらに古いネタ。Win9Xとかなんで、さすがに今の環境とは違いすぎるとは思いますが。
回答ありがとうございます。
GetKeyState(VK_ESCAPE)でキー入力チェックをしたところうまく入力を拾ってくれました。
GetKeyboardState()はコンソールではタイミングが合ってないという情報はそうなのかもと思いました。ちょっとプログラム量は多くなるかもですけど、GetKeyStateを使うことにします。
ありがとうございました。
No.2
- 回答日時:
キーボードの状態はGetKeyboardState()で取れることにはなっていますが実際に定義通りになっているかというと必ずしもそうなっていません。
(殊にノート型、タブレット型)キーの押下、解放でどのようなイベントが発生してGetKeyboardState()にどう反映されるかはハードウエア依存の部分が多く存在します。
アプリケーションが特定機種で動作すれば良いのならキー状態でどのようなイベントが発生するかを解析して使用する、汎用的に使用できるようにするのであれば別の手段を使用するべきでしょう。
回答ありがとうございます。
定義は普通のキーボードなので合ってるっぽいです。
win32のイベントドリブンなプログラムは難しいと思い、コンソールアプリを作ろうと思ったので、解析するというのはちょっと敷居が高いです。しかしコンソールアプリで不具合が起きた時、イベントの発生の仕組みを理解することは必要なのだろうとは思いますので勉強していきたいと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++ と、 1 2022/11/07 23:45
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- 電気工事士 【電気】PAS(気中負荷開閉器)とPOS (柱上油入開閉器、Pole mounted 3 2023/07/18 23:33
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 電車・路線・地下鉄 JRの駅で簡易委託駅だとPOSでもクレジットカード非対応なのはなぜですか? JRがそう言う取り決めを 4 2022/11/20 14:23
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
既定のコンストラクタがありま...
-
ウインドウの移動禁止
-
C# Controls.Addで動的に配置し...
-
静的でないメンバ関数の呼び出...
-
多重定義が起きている?--lnk20...
-
参照型を格納できるコンテナに...
-
関数ポインタについて
-
関数名の名前の衝突について。
-
C++にてtemplateで受け取った任...
-
派生クラスの自動生成
-
CreateThreadのエラー
-
(void)0 はどんな意味ですか
-
SC_SIZEがわからない
-
クラス内で、親ではない他のク...
-
static constメンバ変数(配列)...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
クラス間でのクラスの共有?
-
関数の再帰とは??[C言語]
-
4桁7セグでダイナミック点灯
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既定のコンストラクタがありま...
-
【gcc・cygwin】multiple defin...
-
戻り値を返す関数の前に(void)...
-
C++にてtemplateで受け取った任...
-
多重定義が起きている?--lnk20...
-
gcc: incompatible pointer type
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
Notepad++の関数リスト表示の変...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
ArduinoでMouse関数を使用して...
-
DLLの関数呼び出しで引数がある...
-
void*型の配列について
-
ウインドウの移動禁止
-
const_castのつかいどころを教...
-
VC++でGetKeyboardStateがうま...
-
C言語 プロトタイプ宣言
-
stddef.hって何?
おすすめ情報