2011-06-16 26 views
7

El control WebBrowser en WPF se hereda del UIElement, pero no podemos registrar controladores de eventos en eventos UIElement. ¿Por qué es? En WPF WebBrowser Mouse Events not working as expected, se responde, pero todavía no puedo entender.Cómo usar los eventos del botón de navegación 'Atrás' y 'Adelante' en WPF WebBrowser?

De todos modos, conectar manejadores a los eventos provistos por el documento WebBrowser puede atrapar la mayoría de los eventos de mouse pero no puede usar 'Atrás' & 'Avanzar' eventos de botón de navegación. Dado que Internet Explorer puede hacer esto, creo que es posible. ¿Hay alguna forma de resolver este problema?

ACTUALIZACIÓN: En esta pregunta, significa 'Back' & 'Forward' navigation buttons XButton1 y XButton2 en el sistema de ratón de 5 botones.

UPDATE2: He solucionado esta pregunta con la respuesta de Navid Rahmani. Creo que alguien necesitará esta respuesta, así que adjunto la parte principal. Si encuentra algún problema o una solución más razonable, hágamelo saber.

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

Gracias por la actualización –

+0

No hay problema. Está arreglado a través de tus esfuerzos. –

Respuesta

2

Puede utilizar gancho de bajo nivel de ratón y comprobar si el xbutton1 o xbutton2 clic
vistazo here

por el valor de mirar WM_XBUTTONDOWNhttp://msdn.microsoft.com/en-us/library/ms646245(VS.85).aspx

+0

Intenté como respuesta, pero el evento 'WM_LBUTTONDOWN' fue genial y el evento' XBUTTON' no. Intenté '0x0001 y 0x0020' como el valor de' MouseMessages enum' para el evento 'XBUTTON'. Hice algo mal? –

+0

¿has verificado el texto de orden superior? mira este enlace http://msdn.microsoft.com/en-us/library/ms997498.aspx –

+0

No deberías marcar '0x020C' y para el botón verificar el parámetro de palabras de mayor orden' 0x0001' y '0x0002' –

0

El control WebBrowser es realmente una envoltura delgada alrededor del objeto Trident COM. No es 'puro WPF' como otros controles incorporados ... así que muchas cosas normales no funcionan con eso. Para responder a su pregunta, lo más cercano que puede obtener es conectarse al evento Navegación. Esto no le dirá si el usuario está tratando de avanzar o retroceder o en otro lugar, pero le dará la URL y la oportunidad de establecer e.Cancel = true para detener la navegación (generalmente seguido de una llamada a Navigate (url) para tomar el usuario en otro lugar).

+0

En primer lugar, me gustaría agradecer su respuesta. Sin embargo, independientemente de una dirección, no puedo registrar un identificador de evento para el evento de navegación del 'WebBrowser' con el clic del mouse' XButton'. –

3

Mucho más simple camino ....

Esto funciona para mí en WPF y .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

MouseDown y PreviewMouseDown son tragados por el control WebBrowser, por lo que no funcionó para mí. – Dave

Cuestiones relacionadas