はかせのラボ

私の頭の中を書いていく雑記ブログです

C++ GetKeyboardStateでキーボードの入力を取得する

あいさつ

どうも、はかせです。
今日も今日とて過去にD3D11で使ってた
便利クラス的なものの移植をやってました。

その中でDirectInputを使った入力クラスがありました。
もちろん今後何らかの検証やデバッグをしていくにあたって
入力取得は必須ですから移植しようとしました。

ただ移植した後でビルドしたらうまく動きませんでした。

デバッガで見てみたところ
SetDataFormatというメソッドがうまく機能していませんでした

色々ググったり試してみたりしたのですが、
なにやらx86環境でないと動かなさそうな雰囲気。
元々DirectInputはWin32APIのラッパーだったみたいですし、
もしかしたら根っこの部分ではまだWin32APIを使っているのかもしれません。

そんなわけで
x64環境ではDirectInputが使えなさそう
ということがわかりました。

じゃあどうやって入力取るのよって話ですが、
素直にWindowsAPIを使うことにしました。

前置きがかなり長くなってしまいましたがそんなわけで
今回は入力取得に使ったGetKeyboardStateについてです。

GetKeyboardStateとは

WindowsAPIの一つで名前の通り
キーボードの入力状況を取得してきます。

引数に256の要素を持つBYTE配列を渡すことで
その中に入力状況を示すバイトデータが格納されます。

あとは調べたいキーが格納されている要素の
先頭ビットが立っているかを確認すれば
入力の有無を確認できます。

//入力状況取得
BYTE mInputByteBuffer[256];
if (!GetKeyboardState(mInputByteBuffer)) {}

//実際に入力を確認
if(mInputByteBuffer[VK_RETURN] & 0x80) //リターンキーが入力されてたら~

ただこのままでは入力の有無しか取れません。
ちょうどこのフレームで入力されたのか、
はたまた押しっぱだったのかとかはわかりません。

この辺は1フレーム前の状況を保持して置いて
それとの比較で確認することができます。

どんな感じで実装するかとかは
以前上げていますのでそちらの記事を見て頂いたらと思います。
hakase0274.hatenablog.com

それにしても今見ると文章が拙いように見えますね。
(リライトしてもいいんだろうけど、
したところでなぁってのもある)

それだけ文章っていうか
ブログ書くことに慣れたってことですかね。

まぁ1年ぐらい続けてるわけですから
多少はうまくなりますよね。


うまくなってますよね・・・・・?

あとがき

今回はGetKeyboardStateというWindowsAPIを使った入力取得でした。
DirectInputに比べて前準備と後始末がいらないので管理が楽ですね。
(おそらく内部的になんかやってるんでしょうけど)

コードも半分くらいになりましたし、
割と直感的にもなりました。

WindowsAPIなのでWindowsありさえすれば
x86やx64といった環境の違いを気にすることなく使えるのと、
移植に特別な手間が掛からないのがいいですね!
(Mac?知らない子ですねぇ・・・)

DirectInputx86環境下ならば
バイス直叩きで値を取ってくるので
パフォーマンス的にはいいんでしょうけど、
x64環境下でうまく動かないのは
昨今の開発環境的にいかがなものですかね。

まぁ開発元のMicrosoftも開発停止して他の使えって言ってますし
おとなしくこういったWindowsAPIかXInput使って
入力取るのが良さそうですね。

それでは今回はこの辺でノシ
今回作ったものはGitHubに上げました
github.com