MFC属性页面上的WebBrowser控件 - 需要处理TAB键按下

时间:2014-05-02 14:29:09

标签: c# winforms mfc webbrowser-control

我正在尝试在MFC属性页上托管.NET Windows窗体WebBrowser控件。要做到这一点,我正在使用CWinFormsControls类。这一切都很好,但由于我在属性页面上似乎有一个问题,属性表消耗TAB和RETURN按键来执行导航或默认按键行为,即在Web浏览器控件时按TAB键有焦点不会将焦点移动到网页中的下一个控件(该页面有一个用户名和密码编辑框加上一个'提交'按钮,我希望TAB在页面上的框之间移动并返回提交) 。最终用户不会对这种仅限鼠标的行为感到满意,所以我需要Web浏览器来处理TAB和RETURN键而不是属性表

经过一番研究 - 对于MFC和WinForms,我是一个新手 - 我认为问题可能是由于IsDialogMessage,属性页正在使用这些密钥,在内部向网络浏览器发送WM_GETDLGCODE消息,网络浏览器仅返回DLGC_WANTARROWSDLGC_WANTCHARS,但关键是返回DLGC_WANTTAB。因此,Web浏览器永远不会看到TAB键来处理它。

所以我尝试了很多东西,但最有希望的方法似乎是从WebBrowser派生我自己的控件,然后覆盖WndProc函数来显式处理WM_GETDLGCODE消息并请求TAB键:

protected override void WndProc(ref Message m)
{
    if (m.Msg == 0x87 /* WM_GETDLGCODE */)         {
        m.Result = (IntPtr)0x83; // DLGC_WANTARROWS|DLGC_WANTTAB|DLGC_WANTCHARS
    } else {
        base.WndProc(ref m);
    }
}

这个函数确实被调用了。但是,TAB键仍然无法正常工作。将Spy ++附加到Web浏览器窗口会显示尽管似乎处理WM_GETDLGCODE,但响应并不像预期的那样:

spy++ output

我无法解释,显然无法解决问题。

那么,我会以正确的方式解决这个问题吗? 这个问题是否有'正确'解决方案?

我尝试使用PreTranslateMessage显式拦截TAB和RETURN按键,并以某种方式(SendKeys API)将它们发送到Web浏览器控件。这适用于TAB键但导致RETURN键的缓冲区溢出。所以没有运气,无论如何它感觉像是一个讨厌的黑客。

这篇文章已经很久了。如果您需要更多信息,请询问。非常感谢所有人的帮助。

2 个答案:

答案 0 :(得分:0)

经过一些研究后,似乎更好的解决办法是从CPropertyPage派生我自己的班级并将其覆盖PreTranslateMessage作为:

BOOL CMyPage::PreTranslateMessage(MSG* pMsg)
{
    return CDialog::PreTranslateMessage(pMsg);
}

即。使属性页面表现得好像它是一个常规对话框。原因是属性页按照父属性表来处理按键,如TAB和RETURN。

通过这个微小的更改,我的网络浏览器控件可以获得所有按键并按预期运行。

答案 1 :(得分:-1)

如果这对某人有帮助,我将在无模式对话框中运行我的webBrowser。在PretranslateMessage中,我必须对选项卡,删除键和Enter键进行此操作才能正常工作:

BOOL CMyDialog::PreTranslateMessage(::MSG *pMsg)
{
   if (System::Windows::Interop::ComponentDispatcher::RaiseThreadMessage(*reinterpret_cast<System::Windows::Interop::MSG*>(pMsg)))
      return TRUE;
else
   return CVSimWnd::PreTranslateMessage(pMsg);
}