メニューの無いウィンドウで動作するゲームを作ってまして、ゲーム操作にSHIFTやCTRL、ALTキーを使っています。
で、ALTキーを押すとたぶんメニュー開こうとしてゲームの動作が止まってしまいます(上記の通りメニュー自体はありません)。再度ALTキーを押すか、ウィンドウをクリックすれば元に戻ります。
なんとかこの症状を回避する方法(ALTでのメニュー起動を抑制する方法)はないでしょうか?
環境はC++(.NET2003)とDirectX9.0です。
自己申告です。
とりあえず現状以下になっているウィンドウスタイルから
(WS_CAPTION|WS_SYSMENU|WS_BORDER|WS_MINIMIZEBOX)
WS_SYSMENUを削除すればALTキーで止まる(メニューが立ち上がる)ことは無くなりました。しかしこれだと右上の「_□X」ボタンが消えてしまい終了や最小化が出来なくなってしまうので、ちょっとうーん…な状態です。
「_□X」ボタンを出したまま、抑制することは可能でしょうか?
(どうもOSの基本動作のようですので無理そうな気がしますが…)
PreTranslateMessage() をオーバーライドし、次のようにします。
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_SYSKEYDOWN) {
if (pMsg->wParam == VK_MENU) {
return TRUE;
}
}
return CFrameWnd::PreTranslateMessage(pMsg);
}
フレームワークの明記がないのでSDKの場合の対処法。
MSG msg;
while( GetMessage(&msg, NULL, 0, 0) )
{
if( msg.message == WM_SYSKEYDOWN && msg.wParam == VK_MENU )
{
continue;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// エラーチェックとかなし。
ただし、ゲーム内でキー入力をウィンドウプロシージャで行っている場合、
ALTが押されても WM_SYSKEYDOWN が飛んできません。
従って、GetKeyboardStateやGetAsyncKeyStateなどで取得する必要があります。
なるほど!ウィンドウスタイルでどうこうするのではなく、メッセージをフックしてしまうのですか!勉強になりましたm(__)m
MFCは使っていないのと、もともとGetAsyncKeyState()で処理していますので後者の方法で上手くいきました。
お二方、どうも有難うございましたm(__)m
ツイート | ![]() |