我正在尝试在MFC属性页上托管.NET Windows窗体WebBrowser控件。要做到这一点,我正在使用CWinFormsControls类。这一切都很好,但由于我在属性页面上似乎有一个问题,属性表消耗TAB和RETURN按键来执行导航或默认按键行为,即在Web浏览器控件时按TAB键有焦点不会将焦点移动到网页中的下一个控件(该页面有一个用户名和密码编辑框加上一个'提交'按钮,我希望TAB在页面上的框之间移动并返回提交) 。最终用户不会对这种仅限鼠标的行为感到满意,所以我需要Web浏览器来处理TAB和RETURN键而不是属性表。
经过一番研究 - 对于MFC和WinForms,我是一个新手 - 我认为问题可能是由于IsDialogMessage,属性页正在使用这些密钥,在内部向网络浏览器发送WM_GETDLGCODE消息,网络浏览器仅返回DLGC_WANTARROWS
和DLGC_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
,但响应并不像预期的那样:
我无法解释,显然无法解决问题。
那么,我会以正确的方式解决这个问题吗? 这个问题是否有'正确'解决方案?
我尝试使用PreTranslateMessage显式拦截TAB和RETURN按键,并以某种方式(SendKeys API)将它们发送到Web浏览器控件。这适用于TAB键但导致RETURN键的缓冲区溢出。所以没有运气,无论如何它感觉像是一个讨厌的黑客。
这篇文章已经很久了。如果您需要更多信息,请询问。非常感谢所有人的帮助。
答案 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);
}