Как использовать события кнопки «Назад» и «Вперед» в WPF WebBrowser? - PullRequest
8 голосов
/ 16 июня 2011

Элемент управления WebBrowser в WPF наследуется от UIElement, но мы не можем зарегистрировать обработчики событий в событиях UIElement.Почему это?На событиях мыши WPF WebBrowser не работают, как ожидалось , он отвечает, но я все еще не могу понять.

В любом случае, перехват обработчиков к событиям, предоставленным в документе WebBrowser, может перехватитьбольшинство событий мыши, но не могут использовать события кнопок «Назад» и «Вперед».Поскольку интернет-обозреватель может сделать это, я думаю, что это возможно.Есть ли способ решить эту проблему?

ОБНОВЛЕНИЕ: В этом вопросе 'Back' & 'Forward' navigation buttons означает XButton1 и XButton2 в 5-кнопочной системе мыши.

ОБНОВЛЕНИЕ 2: Я исправил этот вопрос с помощью ответа Навида Рахмани.Я думаю, что кому-то понадобится этот ответ, поэтому я прилагаю основную часть.Если вы найдете какую-либо проблему или более разумное решение, пожалуйста, сообщите мне.

    //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,
    }

Ответы [ 3 ]

4 голосов
/ 16 октября 2013

Намного проще ....

Это работает для меня в 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");
}
2 голосов
/ 18 июня 2011

Вы можете использовать низкоуровневый хук мыши и проверить, нажали ли xbutton1 или xbutton2посмотрите здесь

для значения WM_XBUTTONDOWN посмотрите http://msdn.microsoft.com/en-us/library/ms646245(VS.85).aspx

0 голосов
/ 17 июня 2011

Контроллер WebBrowser - это просто тонкая оболочка вокруг COM-объекта Trident.Это не «чистый WPF», как другие встроенные элементы управления ... поэтому многие нормальные вещи не работают с ним.Чтобы ответить на ваш вопрос, самое близкое, что вы можете получить - это подключиться к событию Navigating.Это не скажет вам, пытается ли пользователь перейти вперед или назад или куда-либо еще, но даст вам URL и возможность установить e.Cancel = true, чтобы остановить навигацию (обычно после этого вызывается Navigate (url), чтобы принятьпользователь где-то еще).

...