ALTキーによるメニューの起動を禁止するには

解決


GSZ  2006-08-29 04:55:12  No: 62843

メニューの無いウィンドウで動作するゲームを作ってまして、ゲーム操作にSHIFTやCTRL、ALTキーを使っています。
で、ALTキーを押すとたぶんメニュー開こうとしてゲームの動作が止まってしまいます(上記の通りメニュー自体はありません)。再度ALTキーを押すか、ウィンドウをクリックすれば元に戻ります。

なんとかこの症状を回避する方法(ALTでのメニュー起動を抑制する方法)はないでしょうか?

環境はC++(.NET2003)とDirectX9.0です。


GSZ  2006-08-30 22:15:08  No: 62844

自己申告です。
とりあえず現状以下になっているウィンドウスタイルから
(WS_CAPTION|WS_SYSMENU|WS_BORDER|WS_MINIMIZEBOX)

WS_SYSMENUを削除すればALTキーで止まる(メニューが立ち上がる)ことは無くなりました。しかしこれだと右上の「_□X」ボタンが消えてしまい終了や最小化が出来なくなってしまうので、ちょっとうーん…な状態です。

「_□X」ボタンを出したまま、抑制することは可能でしょうか?
(どうもOSの基本動作のようですので無理そうな気がしますが…)


dairygoods  2006-08-30 22:28:47  No: 62845

PreTranslateMessage() をオーバーライドし、次のようにします。

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) 
{
  if (pMsg->message == WM_SYSKEYDOWN) {
    if (pMsg->wParam == VK_MENU) {
      return TRUE;
    }
  }
  return CFrameWnd::PreTranslateMessage(pMsg);
}


名無しさん  2006-08-31 02:51:18  No: 62846

フレームワークの明記がないので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などで取得する必要があります。


GSZ  2006-08-31 03:42:01  No: 62847

なるほど!ウィンドウスタイルでどうこうするのではなく、メッセージをフックしてしまうのですか!勉強になりましたm(__)m

MFCは使っていないのと、もともとGetAsyncKeyState()で処理していますので後者の方法で上手くいきました。

お二方、どうも有難うございましたm(__)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加