【发布时间】: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() 的代码。