对于在对话框程Dlg1序中嵌入对话框Dlg2的程序来说,定义好系统菜单热键,按键Alt+“菜单项(如F)”会弹出下拉菜单,但如果焦点放在Dlg2中时,再次按键Alt+F时,没有再次弹出下拉菜单(即热键无效),而快捷键(先按键按下Alt放开Alt,然后才按键F菜单有效)有效,其实原因在于焦点在Dlg2中了,按键Alt+F被Dlg2拦截没有发送到Dlg1中,因此只需在Dlg2中的PreTranslateMessage函数中拦截到Alt按键发送到或调用Dlg1中的PreTranslateMessage函数即可:
if(pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN)
{
if (GetKeyState(VK_LMENU) < 0)
{
m_pDlg1->SetFocus(); //程序的关键,在Dlg1获得焦点后才能进行Menu处理
return m_pDlg1->PreTranslateMessage(pMsg); //Dlg1中可不用(定义)继承PreTranslateMessage函数
}
}
注: 1,Alt消息需要用WM_SYSKEYDOWN进行判断,而WM_KEYDOWN 不判断是否有Alt按键
2,ALT键虚拟码有:VK_MENU,VK_LMENU,VK_RMENU(可根据需要自己拦截什么按键)