ページ 11

GeyKeyboardState関数について

Posted: 2015年9月05日(土) 20:34
by びせいぶつ
いつもお世話になっております。
今回、GetKeyboardState関数を使って、何かキーが押されたら処理を行うというコードを作成しようとしました。
ですが、何も入力していないのに、常にキーが入力された状態になってしまいます。
今回作成した関数はこのようになっています。

コード:

/*--- Keyboard.h ---*/
#pragma once
#include<iostream>
#include<Windows.h>

byte keyBuf[256] = { 0 }; //キーが押されているか確認
byte keyState[256] = { 0 }; //押されている間に値を加算

int MygetKeyState() {
	if (GetKeyboardState(keyBuf)) { //入力がされたら
		for (int i = 0; i < 256; i++) {
			if (keyBuf[i]) {
				keyState[i]++;
				std::cout << i << std::endl; //デバッグ用
			}
			else
				keyState[i] = 0;
		}
	}
	return 0;
}

/*--- main.cpp ---*/
#include"Keyboard.h"

int main(){
        MygetKeyState();
        return 0;
}
 


/*--- 実行結果 ---*/
1
2
5
8
13
144
240
246
251

このように、幾つかのキーが入力された状態になっていました。
これは何が原因なのでしょうか?自分の関数の使い方が間違っているのでしょうか?
ご教授よろしくお願いいたします。

Re: GeyKeyboardState関数について

Posted: 2015年9月05日(土) 20:36
by びせいぶつ
開発環境は win7 64bit VisualStdio2013 です。

Re: GeyKeyboardState関数について

Posted: 2015年9月06日(日) 13:04
by Bull
これは何が原因なのでしょうか?自分の関数の使い方が間違っているのでしょうか?
GetKeyboardState()の返却値の意味を取り違えてい
いるようです。GetKeyboardState()は'TRUE'または
'FALSE'を返しますが、関数が正常終了したかどうか
を意味します。キー入力が有ろうと無かろうと、普
通はTRUEを返します。keyBufには仮想キーの状態が
格納されますが、キーが押されている場合は最上位
ビットが1になります。
詳細はMSDNで確認してください。

ちょっとしたサンプルです。

コード:

#define  WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>

#pragma comment(lib,"User32.lib")

int main(void)
{
	for (;;) {
		BYTE	bKeyState[256];
		::GetKeyboardState(bKeyState);
		for (int i = 0; i < 0xF0; ++i) {
			if (bKeyState[i] & 0x80)
				printf("(%02X):%02X\n", i, bKeyState[i]);
		}

		if (GetKeyState(VK_LSHIFT) & 0x80)			// 左シフトキーが押されたら
			break;									// ループを抜ける

		Sleep(100);
	}
}


Re: GeyKeyboardState関数について

Posted: 2015年9月09日(水) 23:32
by びせいぶつ
返信遅れてしまい申し訳ありません。
ご回答ありがとうございます。

ということは、見るべきは最上位と最下位のbitのみで、それ以外のbitは何が入っているか保証されていない。
という判断でよろしいのでしょうか?

Re: GeyKeyboardState関数について

Posted: 2015年9月09日(水) 23:41
by Bull
びせいぶつ さんが書きました:ということは、見るべきは最上位と最下位のbitのみで、それ以外のbitは何が入っているか保証されていない。
という判断でよろしいのでしょうか?
保証されていないと言うか、意味がないと言うことでしょうね。
オフトピック
普通は0になっていと思いますが、まあどっちでもいいんです