当无模式弹出窗口具有焦点时,加速键不起作用

Accelerator keys not working when modeless popup has the focus

我的主 CDialog 有时会显示一个子无模式对话框,如下所示:

只有在用户配置为自动显示时才会显示。


它通过调用此函数的主对话框 OnInitDialog 显示:

void CChristianLifeMinistryEditorDlg::DisplayAssignHistoryDialog()
{
    BOOL    bShowAssignHistoryDialog;
    bShowAssignHistoryDialog = theApp.GetNumberSetting(_T("Options"), _T("SM_ShowAssignHist"), TRUE);
    if (bShowAssignHistoryDialog)
    {
        m_pAssignHistoryDlg = std::make_unique<CAssignHistoryDlg>(); // .release();
        if (m_pAssignHistoryDlg != nullptr)
        {
            m_pAssignHistoryDlg->SetAssignHistMap(&m_mapSPtrHist, &m_HistoryOriginal);
            m_pAssignHistoryDlg->Create(IDD_DIALOG_ASSIGN_HISTORY, this);
            m_pAssignHistoryDlg->ShowWindow(SW_SHOWNORMAL);
            m_pAssignHistoryDlg->UpdateWindow();
            m_pAssignHistoryDlg->EnableTree(false);
        }
    }
}

我注意到我的一些主要 windows 加速器热键并不总是有效。然后我意识到这是因为弹出 window 有焦点。如果我单击主对话框上的任意位置以使其获得焦点,那么我的加速器热键就会起作用。


有什么方法可以让主编辑器轻松处理它的热键,即使无模式 window 可能有焦点?满足此要求的标准方法?


主要 window 像这样处理加速器:

BOOL CChristianLifeMinistryEditorDlg::PreTranslateMessage(MSG * pMsg)
{
    if (m_hAccelTable)
    {
        if (::TranslateAccelerator(GetSafeHwnd(), m_hAccelTable, pMsg))
            return TRUE;
    }
}

并且弹出式无模式 window 也使用了 PreTranslateMessage(如果它是相关的):

BOOL CAssignHistoryDlg::PreTranslateMessage(MSG* pMsg)
{
    BOOL    bNoDispatch{}, bDealtWith = bDealtWith = FALSE ;

    if ( (pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP || 
        pMsg->message == WM_CHAR) 
        && pMsg->wParam == VK_RETURN)
    {
        // Eat it.
        bNoDispatch = TRUE ;
        bDealtWith = TRUE ;
    }

    if (!bDealtWith)
        bNoDispatch = CResizingDialog::PreTranslateMessage(pMsg);

    return bNoDispatch ;
}

我会将你的 m_hAccelTableCChristianLifeMinistryEditorDlg 传递到 CAssignHistoryDlg 并将其添加到 CAssignHistoryDlg::PreTranslateMessage 的开头:

if (m_hAccelTable)
{
    if (::TranslateAccelerator(GetParent()->GetSafeHwnd(), m_hAccelTable, pMsg))
        return TRUE;
}