elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  clonar dos webbrowser dentro del mismo formulario de visual basic 2010 - Ayuda
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: clonar dos webbrowser dentro del mismo formulario de visual basic 2010 - Ayuda  (Leído 2,346 veces)
lararich

Desconectado Desconectado

Mensajes: 21


Ver Perfil
clonar dos webbrowser dentro del mismo formulario de visual basic 2010 - Ayuda
« en: 25 Enero 2016, 22:38 pm »

clonar dos webbrowser dentro del mismo formulario de visual basic 2010 - Ayuda

Que tal Gente!

Estoy solicitando de su amable ayuda les explico:

lo que quiero lograr (es para unas prácticas o ejercicios de aprendizaje) les decia quiero lograr crear una pequeña aplicación capaz de hacer que dos controles webbrowser muestren el mismo movimiento en tiempo real pero solo manipulando uno, el otro webbrowser que sea solo el reflejo de lo pasa con el otro.

para lo cual en un formulario de visual basic pude webbrowser1 y webbrowser2
entonces voy a controlar webbrowser1 navegando por internet pero quiero que a segun voy navegando con el primero el segundo (webbrowser2) muestre lo mismo que voy haciendo en webbrowser1, no se si explique con claridad.

basicamente dos navegadores dentro de la mima ventana pero que al manipular uno el otro navegador corresponda como si se tratase del otro.

en principio yo confiaba en el codigo siguiente:

webbrowser1 = webbrowser2

desntro del evento de inicialización del formulario pero no funciona.

desde ya muchas gracias por sus respuestas, si algo no explique bien hacedmelo saber asi sabremos si tiene solución mi reto de programación.

Saludos!


« Última modificación: 25 Enero 2016, 22:40 pm por lararich » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: clonar dos webbrowser dentro del mismo formulario de visual basic 2010 - Ayuda
« Respuesta #1 en: 26 Enero 2016, 16:53 pm »

¿Sería algo válido representar el segundo webbrowser o "reflejo" como una simple imagen estática o captura del primer webbroser?, o por lo contrario ambos webbrowsers tienen que ser "utilizables"?

Lo primero te ahorraría muchos comecocos de cerebro:



Para dicha metodología puedes tomar como referencia para analizar el código y llevarlo a cabo con las fucniones TakeScreenshotFromRegion o TakeScreenshotFromObject, preferiblemente esta última, ya que la captura mediante regíon pues... es eso, una región del escritorio, donde si superpones ventanas encima del webbrowser éstas se capturarán.

Las funciones las puedes encontrar en el código fuente de mi API ElektroKit:


Código
  1.        ''' ----------------------------------------------------------------------------------------------------
  2.        ''' <summary>
  3.        ''' Takes a screenshot of a screen region.
  4.        ''' </summary>
  5.        ''' ----------------------------------------------------------------------------------------------------
  6.        ''' <example> This is a code example.
  7.        ''' <code>
  8.        ''' Dim jpgCodec As ImageCodecInfo =
  9.        '''     (From codec As ImageCodecInfo In ImageCodecInfo.GetImageDecoders
  10.        '''      Where codec.FormatID = ImageFormat.Jpeg.Guid).SingleOrDefault
  11.        '''
  12.        ''' Dim encoderParams As New EncoderParameters(1)
  13.        ''' Dim qualityEncoder As Imaging.Encoder = Imaging.Encoder.Quality
  14.        ''' Dim qualityParameter As New EncoderParameter(qualityEncoder, 80)
  15.        ''' encoderParams.Param(0) = qualityParameter
  16.        '''
  17.        ''' Dim screenShot As Image = TakeScreenshotFromRegion(New Point(0, 0), New Size(256, 256), includeMouse:=True)
  18.        ''' screenShot.Save("C:\Screenshot.jpg", jpgCodec, encoderParams)
  19.        ''' Process.Start("C:\Screenshot.jpg")
  20.        ''' </code>
  21.        ''' </example>
  22.        ''' ----------------------------------------------------------------------------------------------------
  23.        ''' <param name="location">
  24.        ''' The X-coordinate is the point at the upper-left corner of the region.
  25.        ''' The Y-coordinate is the point at the upper-left corner of the region.
  26.        ''' </param>
  27.        '''
  28.        ''' <param name="size">
  29.        ''' The size of the area to be transferred.
  30.        ''' </param>
  31.        '''
  32.        ''' <param name="includeMouse">
  33.        ''' If set to <see langword="True"/>, the mouse is drawn in the resulting image.
  34.        ''' </param>
  35.        '''
  36.        ''' <param name="pixelFormat">
  37.        ''' The image pixel format.
  38.        ''' </param>
  39.        ''' ----------------------------------------------------------------------------------------------------
  40.        ''' <returns>
  41.        ''' The resulting image.
  42.        ''' </returns>
  43.        ''' ----------------------------------------------------------------------------------------------------
  44.        <DebuggerStepThrough>
  45.        Public Shared Function TakeScreenshotFromRegion(ByVal location As Drawing.Point,
  46.                                                        ByVal size As System.Drawing.Size,
  47.                                                        Optional ByVal includeMouse As Boolean = False,
  48.                                                        Optional ByVal pixelFormat As PixelFormat = PixelFormat.Format24bppRgb) As Image
  49.  
  50.            Dim bmp As New Bitmap(size.Width, size.Height, pixelFormat)
  51.  
  52.            Using g As Graphics = Graphics.FromImage(bmp)
  53.  
  54.                g.InterpolationMode = InterpolationMode.Default
  55.                g.PixelOffsetMode = PixelOffsetMode.Default
  56.                g.CopyFromScreen(location, Drawing.Point.Empty, bmp.Size)
  57.  
  58.                ' Draw the cursor in the image.
  59.                If includeMouse Then
  60.                    Dim mousePoint As Drawing.Point = Control.MousePosition
  61.                    mousePoint.X -= location.X
  62.                    mousePoint.Y -= location.Y
  63.  
  64.                    Cursors.Arrow.Draw(g, New Rectangle(mousePoint.X, mousePoint.Y, Cursors.Arrow.Size.Width, Cursors.Arrow.Size.Height))
  65.                End If
  66.  
  67.            End Using
  68.  
  69.            Return bmp
  70.  
  71.        End Function

Código
  1.        ''' ----------------------------------------------------------------------------------------------------
  2.        ''' <summary>
  3.        ''' Takes a screenshot of an object in the screen.
  4.        ''' </summary>
  5.        ''' ----------------------------------------------------------------------------------------------------
  6.        ''' <example> This is a code example.
  7.        ''' <code>
  8.        ''' Dim jpgCodec As ImageCodecInfo =
  9.        '''     (From codec As ImageCodecInfo In ImageCodecInfo.GetImageDecoders
  10.        '''      Where codec.FormatID = ImageFormat.Jpeg.Guid).SingleOrDefault
  11.        '''
  12.        ''' Dim encoderParams As New EncoderParameters(1)
  13.        ''' Dim qualityEncoder As Imaging.Encoder = Imaging.Encoder.Quality
  14.        ''' Dim qualityParameter As New EncoderParameter(qualityEncoder, 80)
  15.        ''' encoderParams.Param(0) = qualityParameter
  16.        '''
  17.        ''' Dim hwnd As IntPtr = Process.GetProcessesByName("notepad").FirstOrDefault.MainWindowHandle
  18.        '''
  19.        ''' Dim screenShot As Image = TakeScreenshotFromObject(hwnd, includeMouse:=True)
  20.        ''' screenShot.Save("C:\Screenshot.jpg", jpgCodec, encoderParams)
  21.        ''' Process.Start("C:\Screenshot.jpg")
  22.        ''' </code>
  23.        ''' </example>
  24.        ''' ----------------------------------------------------------------------------------------------------
  25.        ''' <param name="hwnd">
  26.        ''' The <see cref="IntPtr"/> window handle to the object.
  27.        ''' </param>
  28.        '''
  29.        ''' <param name="includeMouse">
  30.        ''' If set to <see langword="True"/>, the mouse is drawn in the resulting image.
  31.        ''' </param>
  32.        '''
  33.        ''' <param name="pixelFormat">
  34.        ''' The image pixel format.
  35.        ''' </param>
  36.        ''' ----------------------------------------------------------------------------------------------------
  37.        ''' <returns>
  38.        ''' The resulting image.
  39.        ''' </returns>
  40.        ''' ----------------------------------------------------------------------------------------------------
  41.        ''' <exception cref="System.ComponentModel.Win32Exception">
  42.        ''' </exception>
  43.        ''' ----------------------------------------------------------------------------------------------------
  44.        <DebuggerStepThrough>
  45.        Public Shared Function TakeScreenshotFromObject(ByVal hwnd As IntPtr,
  46.                                                        Optional ByVal includeMouse As Boolean = False,
  47.                                                        Optional ByVal pixelFormat As PixelFormat = PixelFormat.Format24bppRgb) As Image
  48.  
  49.            ' Activate the object window. Don't care about Win32 error code.
  50.            NativeMethods.SetForegroundWindow(hwnd)
  51.            NativeMethods.ShowWindow(hwnd, WindowState.Normal)
  52.  
  53.            Dim result As Boolean
  54.            Dim win32Err As Integer
  55.            Dim win32rect As Rect
  56.            result = NativeMethods.GetWindowRect(hwnd, win32rect)
  57.            win32Err = Marshal.GetLastWin32Error
  58.  
  59.            If Not (result) Then
  60.                Throw New Win32Exception([error]:=win32Err)
  61.  
  62.            Else
  63.                Dim rect As Rectangle = win32rect
  64.                Dim bmp As New Bitmap(rect.Size.Width, rect.Size.Height, pixelFormat)
  65.  
  66.                Using g As Graphics = Graphics.FromImage(bmp)
  67.  
  68.                    g.InterpolationMode = InterpolationMode.Default
  69.                    g.PixelOffsetMode = PixelOffsetMode.Default
  70.                    g.CopyFromScreen(rect.Location, New Drawing.Point(0, 0), bmp.Size)
  71.  
  72.                    ' Draw the cursor in the image.
  73.                    If includeMouse Then
  74.                        Dim mousePoint As Drawing.Point = Control.MousePosition
  75.                        mousePoint.X -= rect.Location.X
  76.                        mousePoint.Y -= rect.Location.Y
  77.  
  78.                        Cursors.Arrow.Draw(g, New Rectangle(mousePoint.X, mousePoint.Y, Cursors.Arrow.Size.Width, Cursors.Arrow.Size.Height))
  79.                    End If
  80.  
  81.                End Using
  82.  
  83.                Return bmp
  84.  
  85.            End If
  86.  
  87.        End Function

( los P/Invokes referenciados en el bloque de la función TakeScreenshotFromObject los puedes encontrar en la class NativeMethods del Namespace ElektroKit.Interop.Win32 )

Ejemplo de uso que utilicé para la imagen GIF de arriba:

Código
  1. Imports System.Drawing.Drawing2D
  2. Imports System.Drawing.Imaging
  3.  
  4. Public NotInheritable Class Form1 : Inherits Form
  5.  
  6.    Dim img As Image
  7.  
  8.    Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) _
  9.    Handles MyBase.Shown
  10.  
  11.        Timer1.Interval = 30
  12.        Timer1.Enabled = True
  13.  
  14.    End Sub
  15.  
  16.    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
  17.  
  18.        If (img IsNot Nothing) Then
  19.            img.Dispose()
  20.        End If
  21.  
  22.        img = TakeScreenshotFromRegion(Me.PointToScreen(WebBrowser1.Location), WebBrowser1.Size, CheckBox1.Checked)
  23.        PictureBox1.BackgroundImage = img
  24.  
  25.    End Sub
  26.  
  27.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  28.  
  29.        WebBrowser1.Navigate(TextBox1.Text)
  30.  
  31.    End Sub
  32.  
  33.    Public Shared Function TakeScreenshotFromRegion(ByVal location As Drawing.Point,
  34.                                                    ByVal size As System.Drawing.Size,
  35.                                                    Optional ByVal includeMouse As Boolean = False,
  36.                                                    Optional ByVal pixelFormat As PixelFormat = PixelFormat.Format24bppRgb) As Image
  37.  
  38.        Dim bmp As New Bitmap(size.Width, size.Height, pixelFormat)
  39.  
  40.        Using g As Graphics = Graphics.FromImage(bmp)
  41.  
  42.            g.InterpolationMode = InterpolationMode.Default
  43.            g.PixelOffsetMode = PixelOffsetMode.Default
  44.            g.CopyFromScreen(location, Drawing.Point.Empty, bmp.Size)
  45.  
  46.            If includeMouse Then
  47.                Dim mousePoint As Drawing.Point = Control.MousePosition
  48.                mousePoint.X -= location.X
  49.                mousePoint.Y -= location.Y
  50.  
  51.                Cursors.Arrow.Draw(g, New Rectangle(mousePoint.X, mousePoint.Y, Cursors.Arrow.Size.Width, Cursors.Arrow.Size.Height))
  52.            End If
  53.  
  54.        End Using
  55.  
  56.        Return bmp
  57.  
  58.    End Function
  59.  
  60. End Class

...Pero como ya mencioné, deberías utilziar la otra función, TakeScreenshotFromObject, no es plan de darte hasta el código funcional todo hecho, jeje, así que te animo a hacerlo con la otra función tomando como base ese ejemplo.



Si por lo contrario quieres hacer que ambos webbrowsers sean manejables pues... vas a tener que esforzarte mucho, mucho más.

Se me ocurre que una posible manera sería heredar la Class del WebBrowser y en lugar de instanciar uno, instanciar dos, y empezar a sustituir y overridear todos los métodos base posibles para hacer las mismas llamadas al segundo control instanciado al mismo tiempo que se hace al primero (por ejemplo, sustituir el método Navigate y sus overloads para llamar al método base "Navigate" de ambos webbrowsers a la vez), pero no se muy bien cuan buenos o malos resultados tendría esta metodología sin haberla puesto en práctica, ya que resulta un coñazo hacer eso.

Saludos


« Última modificación: 26 Enero 2016, 17:57 pm por Eleкtro » En línea

lararich

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: clonar dos webbrowser dentro del mismo formulario de visual basic 2010 - Ayuda
« Respuesta #2 en: 26 Enero 2016, 22:25 pm »

gracias por tu repuesta

pues me propongo un desafío algo raro, y asi voy aprendiendo

como bien dije es un experimento que en un futuro me puede abrir buenas ideas

tengo en mente un pryecto de visual y ese sería el caso dos webbrowser clonados

pero de ser muy complicado veré otros métodos, lo de fijar imagenes no es el enfoque

 principal, pero se puede considerar como plan de escape, no ahora pero si al darme

retirada. por ahora me gustaria dos webbvrowser reales y monitoriados al mismo

tiempo.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines