【发布时间】:2014-05-20 15:20:28
【问题描述】:
我正在尝试使用 PostMessage 从 CFormView 更改 CDialog 控件的焦点:
[CHelpView 继承自 CFormView。 而m_wndDlg是一个CSampleDlg(继承自CDialog)对象]
void CHelpView::OnEnterbutton()
{
pSplitterFrame->m_dlgPane->m_wndDlg->PostMessage(WM_KEYDOWN, 'r', 2);
}
BOOL CSampleDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message >= WM_KEYFIRST && // for performance
pMsg->message <= WM_KEYLAST)
{
if (pMsg->wParam=='r' && pMsg->lParam==2){
NextDlgCtrl();
return TRUE;
}
}
}
对话框收到消息,但 NextDlgCtrl 方法不改变焦点。我意识到,如果我更改 PreTranslateMessage 方法,以便在按下 Return 键时,在对话框中,此 NextDlgCtrl 方法会在用户每次点击返回键(从对话框中)时正确更改焦点。然而,我无法通过另一个对话来实现。
有没有人知道它背后的原因或任何提示或解决方法?
谢谢。
编辑:
这是来自 SPY++ 的对话框的(部分)日志文件。
0016013E R WM_GETDLGCODE fuDlgCode:0000
0016013E P WM_KEYDOWN nVirtKey:00726574 cRepeat:2 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
0016013E S WM_NEXTDLGCTL wCtlFocus:(null)(下一个控件接收焦点)fHandle:False
0016013E R WM_NEXTDLGCTL
0016013E S WM_GETDLGCODE
【问题讨论】:
-
您是否在发布 KEYDOWN 后尝试发布 WM_KEYUP?这将更正确地模仿鼠标发生的事情。否则,请尝试使用 Spy++ 将消息捕获到对话框。
-
感谢 rrirower。我不认为发送 KEYDOWN 消息会改变任何内容,因为这些参数仅用于在 PreTranslateMessage 中捕获此特定消息以调用 NextDlgCtrl。
-
我还编辑了问题并添加了与消息相关的部分日志文件。
-
你能确认
PostMessage线上的流量吗?在其上设置断点并告诉我们执行是否停止。