【问题标题】:Preventing a hotkey if modal popup windows are displayed如果显示模式弹出窗口,则防止热键
【发布时间】:2018-06-22 17:46:51
【问题描述】:

几个月前,在 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
        }
    }
}

热键工作正常。但是,如果我当时在我的编辑器中的 另一个 模态弹出窗口内并且不小心按下了热键,则该窗口会出现。如果显示弹出窗口,我没想到我的任何热键都会起作用。

我该如何纠正这个问题?

【问题讨论】:

  • 您为什么使用热键而不是加速键?如果您查看热键的文档,您会发现它们是系统范围的。在程序的另一个模式对话框中按下它们会导致操作发生,这不足为奇。如果有人使用 Word 并按下相同的热键组合,就会发生这种情况。
  • @JoeWillcoxson 那么你如何设置加速器?
  • @JoeWillcoxson 我看到了这个:stackoverflow.com/questions/10702437/…。这是我被告知热键的地方:stackoverflow.com/questions/46817844/…。我的菜单已经有加速器是资源,通过使用“\t”,然后按下按键,但如果某些控件具有焦点,它们并不总是被触发。
  • @JoeWillcoxson 啊,试试这个:blackbeltcoder.com/Articles/mfc/…
  • 我面前没有我的代码,也不想登录 VPN 来查看我的代码。通常,您会创建一个快捷键表。然后,在 PreTranslateMessage() 中,您可以在控件获得机会之前处理 WM_KEYDOWN 消息。在对话框的 PreTranslateMessage() 中,查看组合键并查看它是否与 HACCEL(加速器表)中的键匹配。我会查看加速器表函数,看看是否有一个可以为您完成所有工作并返回一个返回码,说明它是否处理了它。查看 CMDIFrameWnd::OnTranslateMessage() 的代码。

标签: mfc hotkeys


【解决方案1】:

我想出了这个解决方案:

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。这是解决这个问题的正确方法吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2014-08-24
    • 2018-04-23
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2015-11-10
    相关资源
    最近更新 更多