Problema con el control webbrowser

Iniciado por snakeboy8, 24 Enero 2015, 17:15 PM

0 Miembros y 1 Visitante están viendo este tema.

snakeboy8

tengo un problema con el control webbrowser

hice un programa para ver solo una pagina en especial con un form1 y un webbrowser1
pero cuando quiero minimizar la ventana esta regresa a como estaba antes, pasa de minimized a normal automaticamente

esto solo pasa cuando la pagina esta cargada y con esa pagina en especial
con alguna otra pagina no tengo ese problema

como puedo evitar que pase esto?

tambien queria saber si hay alguna forma de detectar el error 404 en el webbrowser mediante codigo
Gracias  :P




Eleкtro

#1
Cita de: darky666 en 24 Enero 2015, 17:15 PMhice un programa para ver solo una pagina en especial con un form1 y un webbrowser1
pero cuando quiero minimizar la ventana esta regresa a como estaba antes, pasa de minimized a normal automaticamente

esto solo pasa cuando la pagina esta cargada y con esa pagina en especial
con alguna otra pagina no tengo ese problema

como puedo evitar que pase esto?

Muestra tú código, y la página en cuestión.






Cita de: darky666 en 24 Enero 2015, 17:15 PMtambien queria saber si hay alguna forma de detectar el error 404 en el webbrowser mediante codigo

No, no es posible.

Tienes dos opciones:

1) Realizar una petición HTTP antes de navegar en el WebBrowser control, para parsear la respuesta del server:
Código (vbnet) [Seleccionar]
'...
Dim response As HttpWebResponse = request.GetResponse()

If response.StatusCode = HttpStatusCode.OK Then
  ...
End If



2) Usar la interface COM de SHDocVw.WebBrowser:

Primero referencia al proyecto Microsoft Internet Controls


Y luego...:
Código (vbnet) [Seleccionar]
Public NotInheritable Class TestForm ' WebBrowser Test Form by Elektro

   Friend WithEvents wb As Windows.Forms.WebBrowser
   Friend WithEvents wbAX As SHDocVw.WebBrowser

   Private ReadOnly uri As New Uri("http://foro.elhacker.net/404/")

   ''' <summary>
   ''' Handles the Load event of the TestForm control.
   ''' </summary>
   ''' <param name="sender">The source of the event.</param>
   ''' <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
   Private Sub TestForm_Load(ByVal sender As Object, ByVal e As EventArgs) _
   Handles MyBase.Load

       Me.wb = New Windows.Forms.WebBrowser
       With Me.wb
           .Dock = DockStyle.Fill
       End With

       MyBase.Controls.Add(Me.wb)

       Me.wbAX = DirectCast(Me.wb.ActiveXInstance, SHDocVw.WebBrowser)

   End Sub

   Private Sub TestForm_Shown(ByVal sender As Object, ByVal e As EventArgs) _
   Handles MyBase.Shown

       Me.wbAX.Navigate(Me.uri.AbsoluteUri)

   End Sub

   ''' <summary>
   ''' Handles the <see cref="SHDocVw.WebBrowser.NavigateError"/> event of the <see cref="wbAX"/> object.
   ''' MSDN Documentation:
   ''' https://msdn.microsoft.com/en-us/library/bb268221%28v=vs.85%29.aspx
   ''' https://msdn.microsoft.com/en-us/library/bb268233%28v=vs.85%29.aspx
   ''' </summary>
   ''' <param name="pDisp">
   ''' Object that evaluates to the top-level or frame WebBrowser object corresponding to the failed navigation.
   ''' </param>
   ''' <param name="url">
   ''' String expression that evaluates to the URL for which navigation failed.
   ''' </param>
   ''' <param name="frame">
   ''' String that evaluates to the name of the frame in which the resource is to be displayed,
   ''' or Null if no named frame is targeted for the resource.
   ''' </param>
   ''' <param name="statusCode">
   ''' Integer that contains a status code corresponding to the error, if available.
   ''' For a list of the possible status codes, see https://msdn.microsoft.com/en-us/library/bb268233%28v=vs.85%29.aspx.
   ''' </param>
   ''' <param name="cancel">
   ''' Boolean that specifies whether to cancel the navigation to an error page and/or any further autosearch.
   ''' </param>
   Private Sub WbAX_NavigateError(ByVal pDisp As Object,
                                  ByRef url As Object,
                                  ByRef frame As Object,
                                  ByRef statusCode As Object,
                                  ByRef cancel As Boolean) Handles wbAX.NavigateError

       Select Case CInt(statusCode)

           Case 404I
               cancel = True
                MessageBox.Show("Server has returned a 404 HTTP status code.",
                                Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)

           Case -2146697211I ' INET_E_RESOURCE_NOT_FOUND
               cancel = True
               ' ...

           Case Else
               ' ...

       End Select

   End Sub

End Class








snakeboy8

#2
los 2 ejemplos que pusiste en codigo son muy buenos gracias

bueno aqui esta el codigo donde la ventana pasa de minimizada a normal por si sola

Código (vbnet) [Seleccionar]
WebBrowser1.Navigate("http://144.76.33.166:443/?0,2,0,15,0&nn=hello")

cabe mencionar que esta pagina usa flash

Eleкtro

#3
Cuando digo que muestres el código me refiero a todo lo que sea relevante al problema, por ejemplo si estás minimizando/restaurando el Form mediante código (o haciendolo en un MDI donde tengas el WebBrowser), etc, a menos que realmente solo sea relevante esa instrucción que mostraste... claro está.

Explica los pasos a seguir para intentar reproducir el problema, porque lo que comentas que te sucede es algo muy raro ...al menos sin conocer más información sobre la app, danos también un poco más de información respecto a la app, ¿es un WinForms?, una imagen también estaría bien.

Saludos








snakeboy8

#4
si es un windowsform normal
este proyecto solo tiene un form y solo tiene un control llamado webbrowser1 y en el form_load este codigo
Código (vbnet) [Seleccionar]
WebBrowser1.Navigate("http://144.76.33.166:443/?0,2,0,15,0&nn=hello")

y a la hora de minimizar el form1 este regresa a su estado original por si solo
aca te dejo el source del proyecto http://www8.zippyshare.com/v/Aj8nAuUu/file.html

ya he intentado en el form_resize añadir codigo para arreglar esto pero el codigo de este evento se ejecuta hasta lo ultimo y no viene sirviendo de nada el codigo de este evento

Eleкtro

#5
Sinceramente, jamás vi este tipo de comportamiento en una aplicación, de todas formas hay varios bugs conocidos sobre la pérdida de foco de un WebBrowser (los cuales Microsoft no ha arreglado en años, ni pensará en hacerlo), y esto parece ser más o menos algo similar, ya que el WebBrowser se activa automaticamente o hace que el form se reactive tras minimizarlo, creo que quizás has descubierto o re-descubierto un bug con el WebBrowser que se da en circunstancias muy específicas (las cuales desconozco), de alguna manera esa url tambien debe estar involucrada, ¿pero cómo?, ¡no lo se!.


Bueno, tras investigar un poco el código he averiguado varias cosas sin sentido

1) La propiedad Dock del WebBrowser es lo que entra en conflicto con el Form, mientras el valor de la propiedad Dock sea Fill, el form se reactivará al minimizarlo, y no sirve de nada insertar el WebBrowser en un panel, o añadir márgenes en el Form (superponer o sobreponer el webbrowser), ni nada similar.

2) Así pues, si no quieres que la ventana del form se auto-restaure, primero debes desactivar el Docking del WebBrowser (cambiarlo de Fill a None), y viceversa al restaurar la ventana del Form, (de None a Fill) pero he aquí otro problema que también has descubierto, no sirve de nada suscribirse a los eventos Size/Resize del Form (ni tampoco del WebBrowser) para intentar hacer esas modificaciones.

3) El problema desaparece si instancias el Form en tiempo de ejecución, en vez de añadir el control en tiempo de diseño. Esa sería una solución.
( Ambos WebBrowsers usando el mismo docking, pero el problema desaparece, ¡no tiene sentido! )


Al final he optado por procesar los mensajes de la ventana usando el procedimiento WndProc, pero vaya mi sorpresa fue descubrir que ¡modificar el Docking del webbrowser justo al procesar el mensaje de minimizado tampoco tiene ningún efecto! (mientras que si lo haces antes, si que surge efecto).

Pero por suerte, descubrí que era suficiente con modificar la visibilidad del WebBrowser, aunque solo tiene efecto si la modificas al procesar los mensajes de la ventana del Form.

Solución:

Código (vbnet) [Seleccionar]
Public Class Form1

   Dim WithEvents wb As WebBrowser = Me.WebBrowser1

   Public Enum WindowsMessages As Integer

       ' MSDN Documentation:
       ' https://msdn.microsoft.com/en-us/library/windows/desktop/ms646360%28v=vs.85%29.aspx

       ''' <summary>
       ''' A window receives this message when the user chooses the maximize button, minimize button, restore button, or close button.
       ''' </summary>
       WM_SYSCOMMAND = &H112I

   End Enum

   Public Enum wParams As Integer

       ' MSDN Documentation:
       ' https://msdn.microsoft.com/en-us/library/windows/desktop/ms646360%28v=vs.85%29.aspx

       ''' <summary>
       ''' Minimizes the window.
       ''' </summary>
       SC_MINIMIZE = &HF020I

       ''' <summary>
       ''' Restores the window to its normal position and size.
       ''' </summary>
       SC_RESTORE = &HF120I

   End Enum

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load

       '  MyBase.Controls.Add(Me.wb)

       With Me.wb
           .Dock = DockStyle.Fill
           .Navigate("http://144.76.33.166:443/?0,2,0,15,0&nn=hello")
       End With

   End Sub

   ''' <summary>
   ''' Invokes the default window procedure associated with this window to process messages.
   ''' </summary>
   ''' <param name="m">
   ''' A <see cref="T:System.Windows.Forms.Message"/> that is associated with the current Windows message.
   ''' </param>
   Protected Overrides Sub WndProc(ByRef m As Message)

       If m.Msg = WindowsMessages.WM_SYSCOMMAND Then

           Select Case m.WParam.ToInt32

               Case wParams.SC_MINIMIZE
                   Me.wb.Visible = False

               Case wParams.SC_RESTORE
                   Me.wb.Visible = True

               Case Else
                   ' Do Nothing

           End Select

       End If

       ' Return Message to base message handler.
       MyBase.WndProc(m)

   End Sub

End Class


Saludos








snakeboy8

Gracias bro la verdad te la rifaste  ;-)
Gracias