重定向快捷键消息
之前碰到一个问题,需要在其他窗口中响应兄弟窗口的快捷键消息。
再三试验,作法如下:
假设有父对话框类 CPDialog, 和其上两个子对话框 page1, page2。
page1中定义了快捷键C, page2中定义了快捷键D,现在,需要当在page1上按D时,page2,仍可响应,在page2上按C时,page1仍可响应。
在 CPDialog 中重载 PreTranslateMessage() 消息,当pMsg->message == WM_KEYDOWN时, 分别取page1和page2上的一个控件,将消息重定向。
代码
BOOL CPDialog::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if (pMsg->message == WM_KEYDOWN)
{
do
{
CWnd* pWnd = page1.GetDlgItem(IDC_Control1);
if (NULL == pWnd)
break;
MSG msg = *pMsg;
msg.hwnd = pWnd->GetSafeHwnd();
child.PreTranslateMessage(&msg);
} while (false);
do
{
CWnd* pWnd = page2.GetDlgItem(IDC_Control2);
if (NULL == pWnd)
break;
MSG msg = *pMsg;
msg.hwnd = pWnd->GetSafeHwnd();
child.PreTranslateMessage(&msg);
} while (false);
}
return CDialog::PreTranslateMessage(pMsg);
}
不足之处:
如果向page1 和 page2 ,CPDialog中有相同快捷键,那么先调用PreTranslateMessage()消息的将会屏蔽后调用的。在本例代码中,如果page1中有快捷键,则不会响应page2和父窗口。如果page2中有快捷键,则不会响应父窗口。
不明之处:
如果将本是父窗口的WM_KEYDOWN消息重定向至子窗口,则后续WM_CHAR WM_KEYUP不会再发送至父窗口。尽管在发送给子窗口后,仍是调用了父窗口的PreTranslateMessage();
下个题目,将会研究为何WM_KEYDOWN消息只真正响应了一次。快捷键,到底是如何动作的。

浙公网安备 33010602011771号