FC2ブログ

WM_KEYDOWNには注意

※この記事は、WINDOWSプログラミングを知っている方対象です。知らない方は読んでもしっくりこない可能性があるので、ご了承ください。
K「Win32 APIに入門したてのみなさん! WM_KEYDOWNには気をつけてください!!」
J「うわ、びっくりした。え、何? WM_KEYDOWN?」
K「Windowsプログラムのメッセージの一つだよ。自分は常にこれに頼っていたせいで、ろくなプログラムができなかった」
J「……ああ、要するに、小説書くのサボって、ずっとプログラミングで遊んでいたわけだ」
K「え? ああ、サボっていたっていうより、プログラミングのせいで小説書く時間がなかったっていう……」
J「それをサボっていたというんだが、……で、WM_KEYDOWNとは?」
K「キーを押したときにくるメッセージのことです。ちなみにキーから離した時には、WM_KEYUPというメッセージがきます」
J「ほうほう……、それで、それの何を気をつけろと?」
K「では今暇な方は、Wordでもメモ帳でも何でもいいので、この記事をコピーしてみてください。丸ごとです」
J「はいはい、……で?」
K「一番上の行にカーソルをおいて、↓キーを押しっぱにしてみてください」
J「おk。……で?」
K「さて、今、一回だけカーソルが移動して、しばらくしてからカーソルが高速で動いたでしょう」
J「言われてみれば……、まあ、当然のこととしか思っていなかったな」
K「これこそがまさにWM_KEYDOWNなのです!」(※多分。でも実際にもWM_KEYDOWNで似た様なことが起こるから、WM_KEYDOWNだと思っていて問題ないと思います)
J「と、いうと?」
K「つまり、ボタンを押しっぱなしにしたとき、一回だけボタンを押したというメッセージが来て、しばらくして、そのメッセージが何度も連続で来るようになるのです」
J「なるほど、……で、それでどんな問題が生じるんだ?」
K「シューティングを想定してみてください。→を押しっぱなしにしたら、押してる間、ずっと移動していなければならないのに、WM_KEYDOWNを使うと、(使い方によっては問題が生じなくなりますが、普通の使い方をすると)一回だけ右に移動して、しばらくして右に移動し始めるという、変な動作が生じるのです」
J「確かにそれはおかしいな。弾幕に余裕でぶつかる」
K「もうひとつ、問題があります。今使ったWordまたはメモ帳を閉じずに、今度は左上にカーソルを持ってきてから、↓を押しっぱなしにして、一番下に行く前に↑を一回押してください」
J「え? うわ、難しいな。えーと、↓を押しっぱで、↑を一回押す。……あ、止まった」
K「そう、↓を押しているのに下に移動しない。これもWM_KEYDOWNの性質のひとつなのです」
J「と、言うと?」
K「キーを同時押しすると、後に押したほうを離したとき、WM_KEYDOWNが来なくなるというわけです。WM_KEYDOWNが来るとき、WPARAM型の副メッセージを連れてきます。この副メッセージをwpとしましょう」
J「ふむふむ、それで?」
K「先ほど、↓を押しっぱなしにしていたとき、wpの値はVK_DOWNなのですが」
J「↓キーを押してまーす、という意味だね」
K「それで↑を押すと、wpの値は書きかえられ、VK_UPになるのです」
J「↑キーを押してまーす、という意味だね」
K「そして↑キーだけを離すと、↓キーを押しているのにもかかわらず、プロシージャーは『今、↑キーを離したから、もう何も押されていないだろう、よし』と思い込み、WM_KEYDOWNを出さなくなってしまうのです」
J「うーん、よくわからんが、要するに、今押しているキーと別のキーを同時押しした場合、押しているキーの情報が別のキーの情報にとってかわられるから、別のキーを離すと、キーを押しているにもかかわらず、キーを押していないかのように判断されてしまうということか」
K「そういうこと、ちゃんとわかってるじゃないか。とくに、WM_KEYDOWN内で」
if(wp==(WPARAM)VK_UP)
K「という風にキーが押されているかを判別する場合は要注意!!」
J「ちなみに上の文は、『↑キーが押されているならば』という意味です」
K「先ほどいったとおり、wpの中身は一つのキーしかないので、このやり方では、SHIFTキーと方向キーの同時押しができません。なので」
if(GetKeyState(VK_UP)&0x80)
K「とすることをお勧めします」
J「これはさっきのとどう違うんだ?」
K「GetKeyState関数は、今押しているキーで判断するため、WM_KEYDOWNさえ発動すれば、wpの値は違えど、ちゃんと↑キーさえ押していればキーが押されていると判断されます」
J「つまり、さっきので↓押してるのに止まっちゃう、なんてことにはならないわけだ」
K「その通り。このような工夫で、『方向キー+SHIFTでダッシュ』なんてことも可能になるわけです」
J「そうだったのか。では長くなったが、最後に一言」
K「RPG開発サークルを作りました。よろしくお願いします」
J「え? 何?」
K「地元の友達と結成したのだ。ただ小規模なため、ゲームの配布や販売などは多分、行いませんが」
J「じゃあよろしくといっても、どうよろしくすればいいんだよ」
K「活動内容などをブログにのせるつもりだ。というわけでよろしくお願いします」
J「あ、そうそう忘れてた。小説は?」
K「……」
J「黙るな!! 次の更新はいつになるんだ!?」
K「一応、書いてはいるんですよ。キュリアと謙次Ⅲも、4ページめに突入してますから」
J「何ページ中?」
K「9ページ中」
J「まだ半分もいってなかったのか、ま、はやく更新してくれよ」
K「持病もちなので、その範囲でがんばります」
J「持病=五月病ね」
K「というわけで、長くなりましたが、ではまた」
スポンサーサイト



コメントの投稿

管理者にだけ表示を許可する

プロフィール

ケーケー

Author:ケーケー
趣味:自作小説執筆、プログラミング、電子工作
好きなゲーム:ぷよぷよ

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR