几个月前,在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
}
}
}
热键运行正常。但是,如果我当时在编辑器中的另一个模式弹出窗口内,并且意外按下热键,则会出现窗口。如果显示弹出窗口,我没想到我的任何热键都能正常工作。
我该如何纠正?
答案 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。这是解决这个问题的正确方法吗?