電子書籍の厳選無料作品が豊富!

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

A 回答 (2件)

コンソールでGetKeyboardState()は…微妙に鬼門なような。


状態変化はメッセージキューの変化時。という情報もあります。

https://tomoemon.hateblo.jp/entry/20071118/p2
10年以上前のネタなので、現在でも適用するのか…
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwln …
さらに古いネタ。Win9Xとかなんで、さすがに今の環境とは違いすぎるとは思いますが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
GetKeyState(VK_ESCAPE)でキー入力チェックをしたところうまく入力を拾ってくれました。
GetKeyboardState()はコンソールではタイミングが合ってないという情報はそうなのかもと思いました。ちょっとプログラム量は多くなるかもですけど、GetKeyStateを使うことにします。
ありがとうございました。

お礼日時:2019/09/26 20:43

キーボードの状態はGetKeyboardState()で取れることにはなっていますが実際に定義通りになっているかというと必ずしもそうなっていません。

(殊にノート型、タブレット型)

キーの押下、解放でどのようなイベントが発生してGetKeyboardState()にどう反映されるかはハードウエア依存の部分が多く存在します。

アプリケーションが特定機種で動作すれば良いのならキー状態でどのようなイベントが発生するかを解析して使用する、汎用的に使用できるようにするのであれば別の手段を使用するべきでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
定義は普通のキーボードなので合ってるっぽいです。
win32のイベントドリブンなプログラムは難しいと思い、コンソールアプリを作ろうと思ったので、解析するというのはちょっと敷居が高いです。しかしコンソールアプリで不具合が起きた時、イベントの発生の仕組みを理解することは必要なのだろうとは思いますので勉強していきたいと思います。
ありがとうございました。

お礼日時:2019/09/26 20:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!