ダイアログベースの WSLアプリが ESCAPEで終了してしまう

作ったアプリが、ESCを押すと終了してしまう。
よく考えると、ダイアログベースアプリの仕様だった。
無効にする方法を考えてみる

LRESULT CMainDlg::OnEscape
  (WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
        return 0;

}

まず、OnEscape の処理を用意しておく

BEGIN_MSG_MAP(CMainDlg)

  COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
  COMMAND_ID_HANDLER(ID_ESCAPE, OnEscape)
END_MSG_MAP()
LRESULT OnCancel(WORD, WORD wID, HWND, BOOL& );
LRESULT OnEscape(WORD, WORD wID, HWND, BOOL& );

メッセージマップに追加
これだけだとメッセージは飛んでこないので
アクセラレータに、 VKEY_ESCをID_ESCAPEで登録

BOOL CMainDlg::PreTranslateMessage(MSG* pMsg)
{
  if (::TranslateAccelerator(mainWnd, m_hAccel, pMsg))
{
    return TRUE;

  } else if (m_webBrowser.IsWindow()
&& m_webBrowser.SendMessage(
      WM_FORWARDMSG, 0, reinterpret_cast(pMsg)))
{
      return true;

  }
  return CWindow::IsDialogMessage(pMsg);
}
LRESULT CMainDlg::OnInitDialog
  (UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL&)
{
  m_hAccel = LoadAccelerators(hSaveInstance,
      MAKEINTRESOURCE(IDR_MAINFRAME));

OnInitDialogでアクセラレータを登録
PreTranslateMessageで処理に飛ばす。

 

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です