Heliodor 2020/03/06 18:13

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 のゲームでは対策されていますね)


ウィンドウスタイルの変更はフルスクリーンよりも先

画面をフルスクリーンにするとき、ウィンドウスタイルも一緒に変更してタイトルなし、ボーダーなし最大化 にしますが、その処理をフルスクリーンに切り替えた後にやるとイロイロおかしくなります。
逆に、フルスクリーンを解除する時はかならず画面モードをウィンドウモードにしてからウィンドウスタイルを適用します。そうしないと、こちらもイロイロおかしくなります。

これはゲームを作り始めてかなり最初の頃にハマッたところなのですが、いまでもたまーに順番を間違えて「あれ??」ってなることがあります



ほんと、役に立たなそうな記事ですね(泣

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索