如果显示模态弹出窗口,则禁止热键

时间:2018-01-13 13:17:57

标签: mfc hotkeys

几个月前,在StackOverflow上有人鼓励我做正确并使用热键。结果我遵循他们的建议。

我在编辑器中分配了几个热键,我刚遇到一个问题。这是其中一个热键:

if (!RegisterHotKey(GetSafeHwnd(), hkEditor_WeekendMeeting, MOD_CONTROL | MOD_SHIFT, 0x57)) // W
    aryStrHotKeyErrors.Add(_T("Control + Shift + W"));

热键事件处理程序:

void CChristianLifeMinistryEditorDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
    switch (nHotKeyId)
    {
    case hkEditor_WeekendMeeting:
        OnFilePublicTalk();
        break;
    default:
        CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);
    }
}

为了清楚起见,我删除了所有其他热键。 OnFilePublicTalk显示弹出式模式对话框:

void CChristianLifeMinistryEditorDlg::OnFilePublicTalk()
{
    CPublicTalkDlg dlgPublicTalk(this);

    if (m_pEntry != nullptr)
    {
        dlgPublicTalk.SetPublicTalkInfo(m_pEntry->GetPublicTalkInfo());
        dlgPublicTalk.SetCircuitVisitMode(m_iIncludeMode == kIncludeServiceTalk); // AJT v17.0.7
        if (dlgPublicTalk.DoModal() == IDOK)
        {
            m_pEntry->SetPublicTalkInfo(dlgPublicTalk.GetPublicTalkInfo());

            SetModified(true);
            UpdatePreview(m_iDateIndex);
            m_pHtmlPreview->Refresh2(REFRESH_COMPLETELY); // Ensure it has refreshed
        }
    }
}

热键运行正常。但是,如果我当时在编辑器中的另一个模式弹出窗口内,并且意外按下热键,则会出现窗口。如果显示弹出窗口,我没想到我的任何热键都能正常工作。

我该如何纠正?

1 个答案:

答案 0 :(得分:0)

我提出了这个解决方案:

void CChristianLifeMinistryEditorDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
    if (GetActiveWindow() != this)
    {
        CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);
        return;
    }

    switch (nHotKeyId)
    {
    case hkEditor_WeekendMeeting:
        OnFilePublicTalk();
        break;
    default:
        CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);
    }
}

我使用了GetActiveWindow。这是解决这个问题的正确方法吗?