重定向快捷键消息

之前碰到一个问题,需要在其他窗口中响应兄弟窗口的快捷键消息。

 

再三试验,作法如下:

假设有父对话框类 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消息只真正响应了一次。快捷键,到底是如何动作的。

posted @ 2010-07-24 22:15  杨海龙  阅读(478)  评论(0)    收藏  举报