WIN32API での注意
はたしてイマドキ WIN32API なんぞをガリガリつかってゲームを作る輩はいるのでしょうか……?
と疑問に思いつつも、メモ的な話を残しておきます。
[PrtScr]を押しても WM_KEY_DOWN は発生しない。でも離せば WM_KEY_UP は発生する
スクリーンショットキーが押された時に自前のスクリーンショット処理をしたい場合は注意が必要です。
WM_KEYDOWN で VK_SNAPSHOT が来るのを待っていても一向に届きません。なぜだかわかりませんが、そういう仕様なのです。
なので、PtrScr をホットキーとして登録して、WM_HOTKEY 経由で PrtScr の押下イベントを受け取れるようにします。
https://gamedev.stackexchange.com/questions/20446/does-vk-snapshot-not-send-a-wm-keydown-only-wm-keyup
RegisterHotKey(hWnd, MY_HOTKEY_SNAPSHOT_DESKTOP, 0, VK_SNAPSHOT); // [PrtScr] (画面全体のスクリーンショット)が押された時
RegisterHotKey(hWnd, MY_HOTKEY_SNAPSHOT_CLIENT, MOD_ALT, VK_SNAPSHOT); // [Alt + PrtScr] (アクティブウィンドウ限定のスクリーンショット)が押された時
のようにホットキーを登録して、メッセージハンドラで
case WM_HOTKEY:
if (wParam == MY_HOTKEY_SNAPSHOT_DESKTOP) {
// [PrtScr] キーの WM_KEY_DOWN の代替処理
}
if (wParam == MY_HOTKEY_SNAPSHOT_CLIENT) {
// [Alt + PrtScr] キーの WM_KEY_DOWN の代替処理
}
のようにします。
Alt または F10 を押すと意図せずにゲーム進行が一時停止する
Alt または F10 を押すとウィンドウのメニューにフォーカスが行きますか、その間ウィンドウの更新ループが停止します。つまりゲームが強○的に一時停止状態になってしまうという事です。
これを防ぎたい場合は、メッセージループとゲーム更新を別スレッドにしてメッセージとは無関係にゲーム処理が流れるようにするか、単純に VK_F10 の key down イベントを windows に伝えずに握りつぶすようにします。
つまり、WM_SYSKEYDOWN で VK_F10 を捕またら DefWindowProc を呼ばずにそのまま return 1 します。
※ちなみに Alt (VK_MENU) と F10 (VK_F10) は WM_KEYDOWN では捕まえられません。WM_SYSKEYDOWN で捕まえます
(自分はゲームをするとき、とりあえず Alt で一時停止するか確認してみます。だからといって何をするわけでもないのですが……。とりあえず Unity と DxLib のゲームでは対策されていますね)
ウィンドウスタイルの変更はフルスクリーンよりも先
画面をフルスクリーンにするとき、ウィンドウスタイルも一緒に変更してタイトルなし、ボーダーなし最大化 にしますが、その処理をフルスクリーンに切り替えた後にやるとイロイロおかしくなります。
逆に、フルスクリーンを解除する時はかならず画面モードをウィンドウモードにしてからウィンドウスタイルを適用します。そうしないと、こちらもイロイロおかしくなります。
これはゲームを作り始めてかなり最初の頃にハマッたところなのですが、いまでもたまーに順番を間違えて「あれ??」ってなることがあります
ほんと、役に立たなそうな記事ですね(泣