WPF中的WebBrowser
控件是从UIElement
继承的,但我们无法在UIElement
个事件中注册事件处理程序。为什么?在WPF WebBrowser Mouse Events not working as expected,它得到了回答,但我仍然无法理解。
无论如何,将处理程序挂钩到WebBrowser
文档提供的事件可以捕获大多数鼠标事件但不能使用'Back'和& “转发”导航按钮事件。由于互联网浏览器可以做到这一点,我认为这是可能的。有什么方法可以解决这个问题吗?
更新
在这个问题中,'Back' & 'Forward' navigation buttons
表示5键鼠标系统中的XButton1和XButton2。
UPDATE2:我用Navid Rahmani的回答解决了这个问题。我认为有人会需要这个答案,所以我附上了主要部分。如果发现任何问题或更合理的解决方案,请告诉我。
//This code assumes the `WebBrowser` field named _webBrowser is already initiated.
//For the detail out of this code, please refer to the Navid Rahmani's answer.
private bool _isMouseOver;
private HTMLDocumentEvents2_Event _docEvent;
public ctor()
{
_webBrowser.LoadCompleted += _webBrowser_LoadCompleted;
}
private void _webBrowser_LoadCompleted(object sender, NavigationEventArgs e)
{
if (_docEvent != null)
{
_docEvent.onmouseover -= _docEvent_onmouseover;
_docEvent.onmouseout -= _docEvent_onmouseout;
}
if (_webBrowser.Document != null)
{
_docEvent = (HTMLDocumentEvents2_Event)_webBrowser.Document;
_docEvent.onmouseover += _docEvent_onmouseover;
_docEvent.onmouseout += _docEvent_onmouseout;
}
}
void _docEvent_onmouseout(IHTMLEventObj pEvtObj)
{
_isMouseOver = false;
}
void _docEvent_onmouseover(IHTMLEventObj pEvtObj)
{
_isMouseOver = true;
}
private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (_isMouseOver)
{
if (nCode >= 0 && (MouseMessages)wParam == MouseMessages.XBUTTON)
{
var hookStruct = (Msllhookstruct)Marshal.PtrToStructure(lParam, typeof(Msllhookstruct));
if (hookStruct.mouseData == 0x10000)
{
//do something when XButto1 clicked
}
else if (hookStruct.mouseData == 0x20000)
{
//do something when XButto2 clicked
}
}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
private enum MouseMessages
{
//WM_LBUTTONDOWN = 0x00A1,
//WM_LBUTTONUP = 0x0202,
//WM_MOUSEMOVE = 0x0200,
//WM_MOUSEWHEEL = 0x020A,
//WM_RBUTTONDOWN = 0x0204,
//WM_RBUTTONUP = 0x0205,
XBUTTON = 0x020B,
}
答案 0 :(得分:4)
更简单的方式......
这适用于WPF和.net 4.5
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton.Equals(MouseButton.XButton1)) MessageBox.Show(@"back");
if (e.ChangedButton.Equals(MouseButton.XButton2)) MessageBox.Show(@"forward");
}
答案 1 :(得分:2)
您可以使用鼠标的低级别挂钩并检查xbutton1或xbutton2是否已点击 看here
表示WM_XBUTTONDOWN
的值http://msdn.microsoft.com/en-us/library/ms646245(VS.85).aspx
答案 2 :(得分:0)
WebBrowser控件实际上只是Trident COM对象的瘦包装器。它不像其他内置控件那样“纯WPF”......因此很多普通的东西都无法使用它。要回答您的问题,您可以获得的最接近的是进入导航事件。这不会告诉你用户是试图前进还是后退或其他地方,但它会给你URL并有机会设置e.Cancel = true来停止导航(通常接着调用Navigate(url)用户在其他地方)。