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


 


Tema destacado: Deseas probar algunas mejoras a la interfaz del foro? Prueba cake! acerca de


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (Moderadores: Novlucker, seba123neo, kub0x, Eleкtro)
| | | |-+  Boton favorito de Mozilla Firefox y otras cosas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 4 Ir Abajo Respuesta Imprimir
Autor Tema: Boton favorito de Mozilla Firefox y otras cosas  (Leído 2,429 veces)
TickTack

Desconectado Desconectado

Mensajes: 56


Ver Perfil
Boton favorito de Mozilla Firefox y otras cosas
« en: 28 Abril 2017, 10:58 »

Hola,

estaba haciendo un navegador en C# y queria agregarle ese boton de favoritos de Mozilla Firefox.
Como puedo hacer ese diseno moviente. Osea una estrella que sale y se mete en un control?

Gracias y saludos


« Última modificación: 1 Mayo 2017, 20:10 por TickTack » En línea

NEBIRE


Desconectado Desconectado

Mensajes: 444


Ver Perfil
Re: Boton favorito de Mozilla Firefox
« Respuesta #1 en: 28 Abril 2017, 15:07 »

Tengo Firefox, y de repente no sé a que movimiento te refieres... supongo que será cuestión de la configuración. Si veo el movimiento de una flechita, cuando se activa una descarga, no se si será idéntico o similar a lo que tú señalas.

Colocas el botón REAL sobre el control que quieres que esté, pero oculto, invisible, o al menos desactivado...
Colocas una imagen (u otro botón) en el lugar de la interfaz original, con la estrella como imagen de fondo (es éste el que se va a movr, el otro está fijo en su sitio).

Cuando el usuario pulse en el botón de la interfaz (por ejemplo), lo único que hará ese botón, es desplazarse desde esa ubicación hasta la ubicación final. Y en ese momento (que llega a la ubicación destino), activa y deja visible (en el mismo sitio el botón que ya está ahí) y éste se oculta, y/o regresa a su sitio de forma instantánea (sin animación).

Esto da la apariencia de que un botón se ha movido desde A hasta B, y que ahora está ahí. Y te libera de la complicación de tener que hacerlo así. Además cada botón tiene así su código propio y específico (siempre que no te haya entendido mal). Así también simplificas qué sucede cuando se pulsa en uno y en el otro (pues son dos botones con misma apariencia y supuestamente son el mismo, de caraal usuario).

Por supuesto el primer botón, debe estar en primer plano, sobre la ventana principal, si no está en primer plano, al pasar sobre otro objeto podría pasar detrás de él. Y debe estar sobre la ventana principal, para que pueda llegar hasta la posición final, sin quedar oculto al trasvasar los límites del contenedor.

Para hacer la animación, deberás traducir la posición relativa (del botón final), a una posición absoluta, para que puedas mover el botón primero en x pasos o en x tiempo.

Si el botón está en origen en el mismo contenedor que que en destino, no hace falta complicarse demasiado. Basta decidir qué evento del usuario debe activar ese movimiento...

Y si vas a hacer demasiadas cosas y/o si vas a tener varios botones actuando del mismo modo, podría quizás interesar más, hacer un control de usuario, que ya realice toda la operatoria y tu solo definas unas propiedades y una acción "Desplegar/Replegar".

Si tienes varios botones que deben actuar del mismo modo. Entonces basta que tengas uno sólo así, cada botón solo mantiene datos del punto inicial y el punto final, y una suscripción a un evento 'terminado', posiciónfinalalcanzada', así cada botón se encarga de activar el 'gemelo' y ocultarse a sí mismo... y en este caso el botón que se mueve sólo sirve paraeso, y se invoca en una función donde se le pasa la cordenada de origen, la de destino, y la apariencia que tiene mientras se mueve...

Posiblemente muchos pasos, puedan ser evitados. Dependerá de como tengas diseñada la interfaz, para que esto sea más sencillo o más complejo...

p.d.: Bueno, a lo mejorte refieres a la estrella (azul) de "editar el marcador (actual)" que está a la derecha del cuadro de búsqueda. Ése hace emerger una ventana... es lo mismo, solo que esta animación aparte del movimiento aparente, también modifica el tamaño. La mejor forma es hacer una captura de la ventanita que está oculta y esa captura siendo una imagen es la que se anima cambiando de tamaño y posición, cuando llega al final, se remplaza por la ventana original (que no ha sufrido cambios de tamaño, y su desplazamiento es de una sola vez.


« Última modificación: 28 Abril 2017, 15:13 por NEBIRE » En línea

TickTack

Desconectado Desconectado

Mensajes: 56


Ver Perfil
Re: Boton favorito de Mozilla Firefox
« Respuesta #2 en: 30 Abril 2017, 19:45 »

Hola NEBIRE,

Citar
Colocas el botón REAL sobre el control que quieres que esté, pero oculto, invisible, o al menos desactivado...
Colocas una imagen (u otro botón) en el lugar de la interfaz original, con la estrella como imagen de fondo (es éste el que se va a movr, el otro está fijo en su sitio).

Tambien puede ser un boton tool strip, no?

Citar
Cuando el usuario pulse en el botón de la interfaz (por ejemplo), lo único que hará ese botón, es desplazarse desde esa ubicación hasta la ubicación final.

Tuve problemas con eso del desplazamiento. Ya empezo al intentar modificar el tamano.
Pero sabes que? Mira:

Citar
Y te libera de la complicación de tener que hacerlo así.

Con esa frase me diste una gran idea.

En vez de hacerlo tan complicado pense en hacer un boton tool strip. Cuando el usuario pulse en ese boton que desaparezca un Tabcontrol (con marcadores) creado que se carga cuando el programa se carga. Si el usuario vuelve a pulsar en ese boton que el Tabcontrol vuelva a aparecer.
El problema es que el WebBrowser se queda como esta cuando el Tabcontrol desaparece en vez de completar el espacio faltante.
Trate de solucionar este problema sumando el ancho del WebBrowser con el ancho del Tabcontrol.

Asi es que cuando un usuario le haga click al boton strip control pase esto:

Código:
private void toolStripButton8_Click(object sender, EventArgs e)
        {
            if(tabControl1.Visible == false)
            {
                tabControl1.Visible = true;
               
            }
            else
            {
                tabControl1.Visible = false;
                webBrowser1.Width = 1002;
                webBrowser1.Height = 449;
            }
           
        }

Pero al hacerlo la altura del WebBrowser se chiquea y no hay ningun efecto en la anchura del WebBrowser ???

Gracias y saludos
En línea

Eleкtro
Novato Astral y
Moderador Global
***
Desconectado Desconectado

Mensajes: 9.056


El sentido común es el menos común de los sentidos


Ver Perfil
Re: Boton favorito de Mozilla Firefox
« Respuesta #3 en: 1 Mayo 2017, 03:17 »

Hola.

No sé que pretendes hacer por "Boton favorito de Mozilla", pero para que tu instancia del WebBrowser ocupe todo el espacio del control contenedor simplemente asígnale el valor DockStyle.Fill a la propiedad WebBrowser.Dock. No necesitas asignarle manualmente un tamaño específico.


Saludos!
En línea


TickTack

Desconectado Desconectado

Mensajes: 56


Ver Perfil
Re: Boton favorito de Mozilla Firefox y otras cosas
« Respuesta #4 en: 1 Mayo 2017, 20:18 »

Citar
pero para que tu instancia del WebBrowser ocupe todo el espacio del control contenedor simplemente asígnale el valor DockStyle.Fill a la propiedad WebBrowser.Dock. No necesitas asignarle manualmente un tamaño específico.

Y yo que andaba calculando el espacio que necesitaba el WebBrowser!!
Que tonto!

Gracias

Pero ahora, porque tengo muchas cosas que hacer en el navegador, cómo puedo hacer que al hacer click con la rueda del mouse en un link se habra en una nueva ventana la pagina?

Lo de hacer una nueva ventana ya esta hecho. Pero como puedo hacer para que se habra en una nueva ventana la pagina a la cual le hice click en su link con la rueda del mouse?

Gracias y saludos
En línea

NEBIRE


Desconectado Desconectado

Mensajes: 444


Ver Perfil
Re: Boton favorito de Mozilla Firefox y otras cosas
« Respuesta #5 en: 2 Mayo 2017, 01:13 »


Lo de hacer una nueva ventana ya esta hecho. Pero como puedo hacer para que se habra en una nueva ventana la pagina a la cual le hice click en su link con la rueda del mouse?
Básicamente necesitas dos cosas:
A - Tu aplicación debería admitir línea de comandos, así necesita al menos entender un comando: Abrir Página URL, es decir por ejemplo: "TickTackNavigator.exe /o http://for.elhacker.net" '/o', vendría a ser el comando "Open", URL,  la dirección que debe abrir.

B - Tu aplicación/navegador una vez se clica en un enlace, recoge su dirección e invoca a la Shell, con el nombre de tu programa y pasándole como parámetros el comando de abrir URL, y la URL.

Entonces, cuando tu navegador (se abra la nueva ventana) reciba un comando, si es '/o' '/O', incluso '/Open' (no discrimines capialización; /Open=/OPEN=/oPeN), ya sabes que significa abrir la URL, que sigue a continuación, copias la URL y la pones en la ventana de dirección (interfaz del usuario), y al tiempo lanzas (internamente), la URL (digo yo, que ya tendrás alguna función que abra la página cuya URL, se recibe o modifica).
« Última modificación: 2 Mayo 2017, 01:17 por NEBIRE » En línea

Eleкtro
Novato Astral y
Moderador Global
***
Desconectado Desconectado

Mensajes: 9.056


El sentido común es el menos común de los sentidos


Ver Perfil
Re: Boton favorito de Mozilla Firefox y otras cosas
« Respuesta #6 en: 2 Mayo 2017, 05:22 »

Pero ahora, porque tengo muchas cosas que hacer en el navegador, cómo puedo hacer que al hacer click con la rueda del mouse en un link se habra en una nueva ventana la pagina?

Lo de hacer una nueva ventana ya esta hecho. Pero como puedo hacer para que se habra en una nueva ventana la pagina a la cual le hice click en su link con la rueda del mouse?

Quieres hacer muchas cosas, pero en los comentarios has demostrado no tener la capacidad (por el momento) para afrontar los problemas más básicos. No pretendo que te lo tomes a la defensiva, no estoy intentando ser ofensivo ni mucho menos, pero creo que debes ser realista contigo mismo y plantearte si realmente crees que puedes seguir con este problema; yo en tu lugar estudiaría más el lenguaje .NET, sobre todo las propiedades y miembros que expone la clase WebBrowser, y analizaría a fondo el código fuente de la clase (que lo tienes a tu disposición en la referencia online de Microsoft) antes de ponerme a intentar hacer nada más complejo, por que basicamente necesitas hackear el control, y entiendase por hackear: realizar una intervención externa para alterar el comportamiento por defecto del componente. En resumen, y en mi opinión personal, debes adquirir mucha más experiencia y comprensión sobre .NET y el WebBrowser si quieres llevar a cabo este tipo de problemas, lo digo en serio.

Mi consejo es que empieces por heredar/subclasear la clase WebBrowser para implementarle todos los cambios/nuevas funcionalidades, y si lo haces así entonces el resto te será un poco más llevadero a partir de esta base.

Ejemplo muy básico:
Código
  1. public class WebBrowserExtended : WebBrowser {
  2. public WebBrowserExtended() {}
  3. }
...y lo extiendes.



El siguiente código lo he escrito para guiarte en lo más dificil demostrándote como puedes controlar los eventos del ratón en un documento html renderizado en el WebBrowser, basicamente mediante los eventos que expone la clase HtmlDocument / HtmlElement.

En el siguiente código abstraigo y simplifico toda complejidad, y expongo las funcionalidades públicas básicas en forma de los siguientes eventos: DocumentMouseDown, DocumentMouseUp, BodyMouseDown y BodyMouseUp. De esta manera, puedes suscribirte al evento de hacer click izquierdo/central/derecho muy facilmente... y el resto de la lógica para resolver el problema se implementaría más tarde, no en esta clase.

Código
  1. <DisplayName("WebBrowserExtended")>
  2. <Description("A extended WebBrowser control.")>
  3. <DesignTimeVisible(True)>
  4. <DesignerCategory("UserControl")>
  5. <ToolboxBitmap(GetType(WebBrowser), "WebBrowser.bmp")>
  6. <ToolboxItemFilter("System.Windows.Forms", ToolboxItemFilterType.Require)>
  7. <ClassInterface(ClassInterfaceType.AutoDispatch)>
  8. <ComVisible(True)>
  9. <DefaultProperty("Url")>
  10. <DefaultEvent("DocumentCompleted")>
  11. <Docking(DockingBehavior.Ask)>
  12. <PermissionSet(SecurityAction.Demand, Name:="FullTrust")>
  13. Public Class WebBrowserExtended : Inherits WebBrowser
  14.  
  15. #Region " Private Fields "
  16.  
  17.    ' Keeps an event-suitable reference of the current WebBrowser.Document instance.
  18.    Private WithEvents doc As HtmlDocument
  19.  
  20.    ' Keeps an event-suitable reference of the current WebBrowser.Document.Body instance.
  21.    Private WithEvents body As HtmlElement
  22.  
  23. #End Region
  24.  
  25. #Region " Events "
  26.  
  27.    Public Event DocumentMouseDown As EventHandler(Of HtmlElementEventArgs)
  28.    Public Event DocumentMouseUp As EventHandler(Of HtmlElementEventArgs)
  29.  
  30.    Public Event BodyMouseDown As EventHandler(Of HtmlElementEventArgs)
  31.    Public Event BodyMouseUp As EventHandler(Of HtmlElementEventArgs)
  32.  
  33. #End Region
  34.  
  35. #Region " Constructors "
  36.  
  37.    <DebuggerNonUserCode>
  38.    Public Sub New()
  39.        Me.ScriptErrorsSuppressed = True
  40.    End Sub
  41.  
  42. #End Region
  43.  
  44. #Region " Event Invocators "
  45.  
  46.    Protected Overridable Sub OnDocumentMouseDown(ByVal e As HtmlElementEventArgs)
  47.        If (Me.DocumentMouseDownEvent IsNot Nothing) Then
  48.            RaiseEvent DocumentMouseDown(Me, e)
  49.        End If
  50.    End Sub
  51.  
  52.    Protected Overridable Sub OnDocumentMouseUp(ByVal e As HtmlElementEventArgs)
  53.        If (Me.DocumentMouseUpEvent IsNot Nothing) Then
  54.            RaiseEvent DocumentMouseUp(Me, e)
  55.        End If
  56.    End Sub
  57.  
  58.    Protected Overridable Sub OnBodyMouseDown(ByVal e As HtmlElementEventArgs)
  59.        If (Me.BodyMouseDownEvent IsNot Nothing) Then
  60.            RaiseEvent BodyMouseDown(Me, e)
  61.        End If
  62.    End Sub
  63.  
  64.    Protected Overridable Sub OnBodyMouseUp(ByVal e As HtmlElementEventArgs)
  65.        If (Me.BodyMouseUpEvent IsNot Nothing) Then
  66.            RaiseEvent BodyMouseUp(Me, e)
  67.        End If
  68.    End Sub
  69.  
  70. #End Region
  71.  
  72. #Region " Event Handlers "
  73.  
  74.    Private Sub WebBrowser_Navigated(ByVal sender As Object, ByVal e As WebBrowserNavigatedEventArgs) Handles Me.Navigated
  75.        Me.doc = Me.Document
  76.        Me.body = Me.Document.Body
  77.    End Sub
  78.  
  79.    Private Sub WebBrowser_Document_MouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs) Handles doc.MouseDown
  80.        Me.OnDocumentMouseDown(e)
  81.    End Sub
  82.  
  83.    Private Sub WebBrowser_Document_MouseUp(ByVal sender As Object, ByVal e As HtmlElementEventArgs) Handles doc.MouseUp
  84.        Me.OnDocumentMouseUp(e)
  85.    End Sub
  86.  
  87.    Private Sub WebBrowser_Body_MouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs) Handles body.MouseDown
  88.        Me.OnBodyMouseDown(e)
  89.    End Sub
  90.  
  91.    Private Sub WebBrowser_Body_MouseUp(ByVal sender As Object, ByVal e As HtmlElementEventArgs) Handles body.MouseUp
  92.        Me.OnBodyMouseUp(e)
  93.    End Sub
  94.  
  95. #End Region
  96.  
  97. End Class

El modo de empleo sería el siguiente. Lo he llenado de comentarios para asegurar que lo entiendas todo bien (o esa es la intención).

En el código faltaría por hackear la funcionalidad por defecto de mover/dragging la página web cuando se hace click en el botón central del ratón sobre la página. Quizás se pueda conseguir invalidando el valor de algún campo base en tiempo de ejecución mediante Reflection, lo cierto es que ahora mismo no sabría decirte por que no he mirado como se podría hacer, me he limitado a desarrollar una funcionalidad básica para controlar los eventos necesarios del ratón/clicks, puesto que nadie me paga por hacer esto, que ya es mucho hacer creo yo, jeje, y como ya dije más arriba lo que faltaría por hacer puedes averiguar y resolverlo tu mismo analizando el código fuente de la clase WebBrowser, pero para eso hay que comprender.

Lo siento por extenderme tanto pero me gusta aclarar hasta el último detalle; este es el código:

Código
  1. Public Class Form1
  2.  
  3.    Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Shown
  4.        ' Cargo una página web aleatoria...
  5.        Me.WebBrowserExtended1.Navigate("http://foro.elhacker.net/")
  6.    End Sub
  7.  
  8.    Private Sub WebBrowserExtended1_DocumentMouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs) Handles WebBrowserExtended1.DocumentMouseDown
  9.  
  10.        ' Creo una referencia corta de nuestro WebBrowser.
  11.        Dim wb As WebBrowserExtended = DirectCast(sender, WebBrowserExtended)
  12.  
  13.        Select Case e.MouseButtonsPressed
  14.  
  15.            ' El botón central del ratón se ha pulsado.
  16.            Case MouseButtons.Middle
  17.  
  18.                ' Obtengo el elemento Html que esté situadio en las coordenadas actuales del puntero del ratón.
  19.                Dim element As HtmlElement = wb.Document.GetElementFromPoint(e.ClientMousePosition)
  20.                ' Comprobación de seguridad.
  21.                If (element IsNot Nothing) Then
  22.                    ' Obtengo el atributo href que contiene la url destino.
  23.                    ' Nótese que esto no funcionará con todo tipo de elementos,
  24.                    ' eso requiere una implementación/análisis/parsing más sofisticado sobre el elemento obtenido, y no es mi tarea hacer eso,
  25.                    ' pero esta metodología cubre la gran mayoría, que es lo que importa para poder extender este ejemplo funcional.
  26.                    Dim url As String = element.GetAttribute("href")
  27.                    ' Comprobación de seguridad.
  28.                    If Not String.IsNullOrWhiteSpace(url) Then
  29.                        Dim uri As Uri = Nothing
  30.                        ' Antes de hacer nada más, compruebo que la url es realmente una url válida.
  31.                        If (Uri.TryCreate(url, UriKind.RelativeOrAbsolute, uri)) Then
  32.                            ' Desactivo temporálmente la navegación de este WebBrowser;
  33.                            ' esto es como decirle: "no hagas nada, que yo me encargo de controlar el evento del ratón".
  34.                            wb.AllowNavigation = False
  35.                            ' Finálmente, aquí podemos hacer lo que queramos con la url obtenida. Por ejemplo:
  36.                            Otro_WebBrowser.Navigate(uri)
  37.                        Else
  38.                            ' La supuesta url no tiene una sintaxis válida.
  39.                            ' Se puede ignorar, o controlar y considerarlo como error.
  40.                        End If ' uri
  41.                    End If ' url
  42.                End If ' element
  43.  
  44.            Case Else
  45.                ' Si se ha pulsado un botón distinto al botón central del ratón,
  46.                ' entonces habilito la navegación del WebBrowser para que controle el evento y navegue a la nueva url.
  47.                wb.AllowNavigation = True
  48.  
  49.        End Select
  50.  
  51.    End Sub
  52.  
  53. End Class



Por último, el código original traducido a C#:

Código
  1. using System;
  2. using System.ComponentModel;
  3. using System.Diagnostics;
  4. using System.Drawing;
  5. using System.Runtime.InteropServices;
  6. using System.Security.Permissions;
  7. using System.Windows.Forms;
  8.  
  9. namespace WindowsFormsApplication1 {
  10.  
  11.    [DisplayName("WebBrowserExtended")]
  12.    [Description("A extended WebBrowser control.")]
  13.    [DesignTimeVisible(true)]
  14.    [DesignerCategory("UserControl")]
  15.    [ToolboxBitmap(typeof(WebBrowser), "WebBrowser.bmp")]
  16.    [ToolboxItemFilter("System.Windows.Forms", ToolboxItemFilterType.Require)]
  17.    [ClassInterface(ClassInterfaceType.AutoDispatch)]
  18.    [ComVisible(true)]
  19.    [DefaultProperty("Url")]
  20.    [DefaultEvent("DocumentCompleted")]
  21.    [Docking(DockingBehavior.Ask)]
  22.    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
  23.    public class WebBrowserExtended : WebBrowser {
  24.  
  25.        #region " Properties "
  26.  
  27.        // Keeps an event-suitable reference of the current WebBrowser.Document instance.
  28.        private HtmlDocument Doc {
  29.            get { return this.docB; }
  30.            set {
  31.                if (this.docB != null) {
  32.                    this.docB.MouseDown -= this.WebBrowser_Document_MouseDown;
  33.                    this.docB.MouseUp -= this.WebBrowser_Document_MouseUp;
  34.                }
  35.                this.docB = value;
  36.                if (this.docB != null) {
  37.                    this.docB.MouseDown += this.WebBrowser_Document_MouseDown;
  38.                    this.docB.MouseUp += this.WebBrowser_Document_MouseUp;
  39.                }
  40.            }
  41.        }
  42.        private HtmlDocument docB; // Backing field.
  43.  
  44.        // Keeps an event-suitable reference of the current WebBrowser.Document.Body instance.
  45.        private HtmlElement Body {
  46.            get { return this.bodyB; }
  47.            set {
  48.                if (this.bodyB != null) {
  49.                    this.bodyB.MouseDown -= this.WebBrowser_Body_MouseDown;
  50.                    this.bodyB.MouseUp -= this.WebBrowser_Body_MouseUp;
  51.                }
  52.                this.bodyB = value;
  53.                if (this.bodyB != null) {
  54.                    this.bodyB.MouseDown += this.WebBrowser_Body_MouseDown;
  55.                    this.bodyB.MouseUp += this.WebBrowser_Body_MouseUp;
  56.                }
  57.            }
  58.        }
  59.        private HtmlElement bodyB; // Backing field.
  60.  
  61.        #endregion
  62.  
  63.        #region " Events "
  64.  
  65.        public event EventHandler<HtmlElementEventArgs> DocumentMouseDown;
  66.        public event EventHandler<HtmlElementEventArgs> DocumentMouseUp;
  67.  
  68.        public event EventHandler<HtmlElementEventArgs> BodyMouseDown;
  69.        public event EventHandler<HtmlElementEventArgs> BodyMouseUp;
  70.  
  71.        #endregion
  72.  
  73.        #region " Constructors "
  74.  
  75.        [DebuggerNonUserCode()]
  76.        public WebBrowserExtended() {
  77.            this.Navigated += this.WebBrowser_Navigated;
  78.            this.ScriptErrorsSuppressed = true;
  79.        }
  80.  
  81.        #endregion
  82.  
  83.        #region " Event Invocators "
  84.  
  85.        protected virtual void OnDocumentMouseDown(HtmlElementEventArgs e) {
  86.            this.DocumentMouseDown?.Invoke(this, e);
  87.        }
  88.  
  89.        protected virtual void OnDocumentMouseUp(HtmlElementEventArgs e) {
  90.            this.DocumentMouseUp?.Invoke(this, e);
  91.        }
  92.  
  93.        protected virtual void OnBodyMouseDown(HtmlElementEventArgs e) {
  94.            this.BodyMouseDown?.Invoke(this, e);
  95.        }
  96.  
  97.        protected virtual void OnBodyMouseUp(HtmlElementEventArgs e) {
  98.            this.BodyMouseUp?.Invoke(this, e);
  99.        }
  100.  
  101.        #endregion
  102.  
  103.        #region " Event Handlers "
  104.  
  105.        private void WebBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e) {
  106.            this.Doc = this.Document;
  107.            this.Body = this.Document.Body;
  108.        }
  109.  
  110.        private void WebBrowser_Document_MouseDown(object sender, HtmlElementEventArgs e) {
  111.            this.OnDocumentMouseDown(e);
  112.        }
  113.  
  114.        private void WebBrowser_Document_MouseUp(object sender, HtmlElementEventArgs e) {
  115.            this.OnDocumentMouseUp(e);
  116.        }
  117.  
  118.        private void WebBrowser_Body_MouseDown(object sender, HtmlElementEventArgs e) {
  119.            this.OnBodyMouseDown(e);
  120.        }
  121.  
  122.        private void WebBrowser_Body_MouseUp(object sender, HtmlElementEventArgs e) {
  123.            this.OnBodyMouseUp(e);
  124.        }
  125.  
  126.        #endregion
  127.  
  128.    }
  129.  
  130. }

+

Código
  1. using System;
  2. using System.Windows.Forms;
  3.  
  4. namespace WindowsFormsApplication1 {
  5.  
  6.    public partial class Form1 : Form {
  7.  
  8.        public Form1() {
  9.            this.InitializeComponent();
  10.            this.Shown += this.Form1_Shown;
  11.            this.webBrowserExtended1.DocumentMouseDown += this.WebBrowserExtended1_DocumentMouseDown;
  12.        }
  13.  
  14.        private void Form1_Shown(object sender, EventArgs e) {
  15.            // Cargo una página web aleatoria...
  16.            this.webBrowserExtended1.Navigate("http://foro.elhacker.net/");
  17.        }
  18.  
  19.        private void WebBrowserExtended1_DocumentMouseDown(object sender, HtmlElementEventArgs e) {
  20.  
  21.            // Creo una referencia corta de nuestro WebBrowser.
  22.            WebBrowserExtended wb = (WebBrowserExtended)sender;
  23.  
  24.            switch (e.MouseButtonsPressed) {
  25.  
  26.                // El botón central del ratón se ha pulsado.
  27.                case MouseButtons.Middle:
  28.  
  29.                    // Obtengo el elemento Html que esté situadio en las coordenadas actuales del puntero del ratón.
  30.                    HtmlElement element = wb.Document.GetElementFromPoint(e.ClientMousePosition);
  31.                    // Comprobación de seguridad.
  32.                    if (element != null) {
  33.                        // Obtengo el atributo href que contiene la url destino.
  34.                        // Nótese que esto no funcionará con todo tipo de elementos,
  35.                        // eso requiere una implementación/análisis/parsing más sofisticado sobre el elemento obtenido, y no es mi tarea hacer eso,
  36.                        // pero esta metodología cubre la gran mayoría, que es lo que importa para poder extender este ejemplo funcional.
  37.                        string url = element.GetAttribute("href");
  38.                        // Comprobación de seguridad.
  39.                        if (!string.IsNullOrWhiteSpace(url)) {
  40.                            Uri uri = null;
  41.                            // Antes de hacer nada más, compruebo que la url es realmente una url válida.
  42.                            if (Uri.TryCreate(url, UriKind.RelativeOrAbsolute, out uri)) {
  43.                                // Desactivo temporálmente la navegación de este WebBrowser;
  44.                                // esto es como decirle: "no hagas nada, que yo me encargo de controlar el evento del ratón".
  45.                                wb.AllowNavigation = false;
  46.                                // Finálmente, aquí podemos hacer lo que queramos con la url obtenida. Por ejemplo:
  47.                                Otro_WebBrowser.Navigate(uri);
  48.                            } else {
  49.                                // La supuesta url no tiene una sintaxis válida.
  50.                                // Se puede ignorar, o controlar y considerarlo como error.
  51.                            } // uri
  52.                        } // url
  53.                    }  // element
  54.                    break;
  55.  
  56.                default:
  57.                    // Si se ha pulsado un botón distinto al botón central del ratón,
  58.                    // entonces habilito la navegación del WebBrowser para que controle el evento y navegue a la nueva url.
  59.                    wb.AllowNavigation = true;
  60.                    break;
  61.            }
  62.  
  63.        }
  64.  
  65.    }
  66. }

Espero que este código de ejemplo (el cual me gustaría que tomases como una especie de plantilla en la que seguir extendiendo tu trabajo) te pueda ser de utilidad, de verdad.

¡Saludos!
« Última modificación: 2 Mayo 2017, 06:16 por Eleкtro » En línea


TickTack

Desconectado Desconectado

Mensajes: 56


Ver Perfil
Re: Boton favorito de Mozilla Firefox y otras cosas
« Respuesta #7 en: 2 Mayo 2017, 13:50 »

Hola NEBIRE,

Estaba pensando en lo mismo que tu pero...

B - Tu aplicación/navegador una vez se clica en un enlace

Primero necesito un metodo o algo que haga que el programa reconozca que le estoy haciendo click en un enlace.

Hola Elektro,

Citar
pero creo que debes ser realista contigo mismo y plantearte si realmente crees que puedes seguir con este problema; yo en tu lugar estudiaría más el lenguaje .NET, sobre todo las propiedades y miembros que expone la clase WebBrowser, y analizaría a fondo el código fuente de la clase (que lo tienes a tu disposición en la referencia online de Microsoft) antes de ponerme a intentar hacer nada más complejo, por que basicamente necesitas hackear el control, y entiendase por hackear: realizar una intervención externa para alterar el comportamiento por defecto del componente. En resumen, y en mi opinión personal, debes adquirir mucha más experiencia y comprensión sobre .NET y el WebBrowser si quieres llevar a cabo este tipo de problemas, lo digo en serio.
1. Si soy realista conmigo mismo entonces no me quedaria otra cosa que suicidarme, ya que no seria nada mas que basura. La persona que dice: "Yo lo puedo hacer!" y la que dice: "Yo no lo puedo hacer"... ambas tienen razon. Como bien reconociste en todos mis posts, en realidad no sirvo para programar en C#. Lo que yo estoy tratando de hacer es seguir adelante, a pesar de algunos comentarios que me tiran para abajo y a pesar de que en algunos ocasiones estoy sin ayuda.
Tu dices que seri recomendable estudiar mas el lenguaje .NET y asi adquirir mas experiencia y comprension. Pero adonde? En las paginas de Microsoft se explican las propiedades, miembros, y otras cosas de la clase en un lenguaje muy alto para mi. Y se me hace que solo de los que vienen del mundo del VB lo entienden. Sin agregar que puedes leer una cosa y ver otra en Visual Studio segun tu comprension.

Citar
puesto que nadie me paga por hacer esto, que ya es mucho hacer creo yo, jeje,

Bueno, no dije que me escribieras tanto. Te admiro, ya que si fuera tu, no tendria las fuerzas para dedicarle tiempo a las dudas de un usuario.

Bueno para que veas que tengo interes en lo que hiciste y para que veas que le tengo mucho respeto, analise el codigo. Y eso se comprueba en las muchas preguntas que tengo. Empiezo:

Que significa esto:

Código:
[DisplayName("WebBrowserExtended")]
    [Description("A extended WebBrowser control.")]
    [DesignTimeVisible(true)]
    [DesignerCategory("UserControl")]
    [ToolboxBitmap(typeof(WebBrowser), "WebBrowser.bmp")]
    [ToolboxItemFilter("System.Windows.Forms", ToolboxItemFilterType.Require)]
    [ClassInterface(ClassInterfaceType.AutoDispatch)]
    [ComVisible(true)]
    [DefaultProperty("Url")]
    [DefaultEvent("DocumentCompleted")]
    [Docking(DockingBehavior.Ask)]
    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]

Ya que yo nunca vi [DisplayName] ni [Description]

Gracias y saludos
 
En línea

Eleкtro
Novato Astral y
Moderador Global
***
Desconectado Desconectado

Mensajes: 9.056


El sentido común es el menos común de los sentidos


Ver Perfil
Re: Boton favorito de Mozilla Firefox y otras cosas
« Respuesta #8 en: 3 Mayo 2017, 00:31 »

Como bien reconociste en todos mis posts, en realidad no sirvo para programar en C#.

¿Cuando he dicho yo eso?. No pienso eso, por que nadie empieza sabiendo, y yo hace unos años no sabía NADA sobre NADA en lo referente a la programación .NET así que sería muy hipócrita por mi parte llamarle a alguien inutil.

Yo lo que he intentado decirte en este post es que para lidiar con un problema de cierta complejidad primero debes tener aprendido y dominado cosas más básicas (como por ejemplo redimensionar un control) por que luego saber esas cosas te ayudarán a adquirir capacidad resolutiva para resolver problemas más complejos.
Se me da mal dar ánimos, pero basicamente esa es mi intención y te estoy sugeriendo que primero estudies otras cosas mas básicas, así serás capaz de ponerte con este otro problema sin ver tantas dificultades.



En las paginas de Microsoft se explican las propiedades, miembros, y otras cosas de la clase en un lenguaje muy alto para mi.

No te frustres. Los lenguajes de más alto nivel son más faciles de aprender (si comparamos por ejemplo con C/C++) por que tienen mucha abstracción de código en comparación. Te lo ponen todo en bandeja a través de miembros como métodos y propiedades (que encapsulan otros miembros y lógica más compleja), solo tienes que aprenderte los nombres y el propósito de cada uno para ir avanzando.



Tu dices que seri recomendable estudiar mas el lenguaje .NET y asi adquirir mas experiencia y comprension. Pero adonde?

Cuando yo utilizo la palabra "estudiar", la acompaño con la palabra PRACTICAR de forma invisible. La MSDN es un lugar de aprendizaje perfecto, por que si te fijas no solo te explican al detalle el propósito de cada membro, sino que además suelen poner ejemplos didácticos abajo al final de la página ...en la mayoría de ocasiones. Además, en la MSDN hay guías específicas para aprender los conceptos de C#, desde cero.

Aparte de la MSDN, Microsoft tiene una galería de códigos de .NET en la que puedes descargar centenares de códigos fuente para el estudio. Aparte de eso en la comunidad de Microsoft puedes encontrar respuestas a muchos problemas de programación relacionados con .NET. Y por si fuera poco, Microsoft también tiene secciones dedicadas a impartir video-tutoriales sobre .NET/C# (aunque no son muchos videos).

Puedes encontrar los enlaces web de todo lo que acabo de mencionar, y muchos más recursos de aprendizaje .NET, aquí:

Y con lo de "estudiar más a fondo la clase WebBrowser" pues me refiero por ejemplo a que te tomes 1 o 2 horas o el tiempo que sea necesario para leer uno a uno todos los miembros que se exponen en la clase WebBrowser y sus descripciones, ya sea en la IDE de Visual Studio o en la MSDN, como prefieras hacerlo. Estoy seguro de que si hubieras hecho esto pero con la clase Control, y hubieras examinado las propiedades Control.Anchor y Control.Dock, habrias resuelto el problema ese que tenías para redimensionar el tamaño del WebBrowser.
Cuando se requiere llevar a cabo manipulaciones más complejas y especificas, conviene analizar también el código fuente de la clase que nos interesa, en este caso el WebBrowser: https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/WebBrowser.cs,3013ded900e5031e -pero esto es para cosas específicas, para comprender como funciona internamente el control, que llamadas hace, cuando se disparan los eventos, conocer el nombre de los miembros internos (para usar Reflection), etc.



analise el codigo. Y eso se comprueba en las muchas preguntas que tengo.:

Bueno no te preocupes tú cualquier cosa que no entiendas, pregúntalo. Para eso estamos.

Que significa esto:

Todo eso son clases de atributos (Attribute Classes en Inglés):

Son basicamente Metadatos. Algunos atributos sencillamente no hacen absolutamente nada y solo sirven como una "marca" para el programador del código (ej. ImmutableObjectAttribute), otros atributos son capaces de modificar el comportamiento del código en tiempo de ejecución, o el comportamiento del diseñador de la clase, como es en este caso...

El atributo DescriptionAttribute: https://msdn.microsoft.com/en-us/library/system.componentmodel.descriptionattribute(v=vs.110).aspx
lo que hace es mostrar una descripción del miembro, en la grilla del control.

El atributo DisplayNameAttribute: https://msdn.microsoft.com/en-us/library/system.componentmodel.displaynameattribute(v=vs.110).aspx
como su propio nombre indica por si solo, sirve para asignar un nombre a mostrar, en la grilla del control.

Ejemplo demostrativo:
Código
  1. public class MiControl : Control {
  2.  
  3. [DisplayName("Nombre a mostrar")]
  4. [Description("Descripción a mostrar.")]
  5. public string MiPropiedad { get; set; }
  6.  
  7. }





Los atributos de clase son lo más irrelevante del código que escribí, me refiero, no te tienes que fijar mucho en ellos por que simplemente los puse por pura estética... para acomodar la representación del control.

A mi lo que me interesa es que pruebes el código que te puse, para que veas que funciona para obtener el enlace de un elemento html cuando pulsas click central del ratón, y luego poder abrir esa url en una nueva ventana o lo que quieras hacer con esa url (bueno, como ya dije el código no funcionará con todos los elementos html. el código necesita ser trabajado más a fondo). Vamos, que me digas si has podido solucionar el problema principal con ese código, o no.



Primero necesito un metodo o algo que haga que el programa reconozca que le estoy haciendo click en un enlace.

Esto ya se te ha explicado y se te ha mostrado un código que lo hace.

Mira, la clase HtmlDocument y HtmlElement exponen los siguientes eventos:

...en particular fíjate en el evento MouseDown. Pues bien, tan solo tienes que subscribirte a ese evento para controlar cuando se hace click en un elemento Html dentro de la instancia del WebBrowser. Luego en mi opinión lo único costoso sería parsear el elemento html para obtener el enlace web al que apunta.

Me explico. Fíjate en este elemento html, esta imagen de aquí abajo; puedes analizarla con las herramientas de depuración desde Firefox o Chrome y verás que el código fuente del elemento contiene un atributo href que apunta hacia la url destino, eso es muy facil de conseguir, eso es lo que hace el código que te mostré en C#:
Cita de: Elektro
Código
  1. element.GetAttribute("href")



...Ahora, yo no soy ningún experto en la programación Web, así que me he encontrado con un problema, y es que hay ciertos elementos html en los que no es tan facil obtener la url, elementos que tienen otra estructura distinta. Como por ejemplo los botones ("Inicio", "Foro", Blog", "WarZone", etc) de la página principal de elhacker: http://www.elhacker.net/ -el código actual que he compartido en C# no es capaz de obtener la url de esos botones.

¡Saludos!
« Última modificación: 3 Mayo 2017, 01:26 por Eleкtro » En línea


Eleкtro
Novato Astral y
Moderador Global
***
Desconectado Desconectado

Mensajes: 9.056


El sentido común es el menos común de los sentidos


Ver Perfil
Re: Boton favorito de Mozilla Firefox y otras cosas
« Respuesta #9 en: 4 Mayo 2017, 11:23 »

Al final encontré una solución para desactivar la funcionalidad de arrastrar/drag que ocurre al pulsar el botón central del ratón, mediante la inyección de código javascript en el documento html.

La solución es chapucera, por que no evita la funcionalidad de arrastrar al pulsar click central en todos los elementos de una página, y tiene otros inconvenientes menores; todo ello está explicado en la siguiente respuesta y los comentarios que dejé en stackOverflow:


EDITO:
Acabo de encontrar otro código en javascript que funciona mejor:
Con eso ya lo tendrías arreglado.

¡Saludos!
« Última modificación: 4 Mayo 2017, 11:45 por Eleкtro » En línea


Páginas: [1] 2 3 4 Ir Arriba Respuesta Imprimir 

Ir a:  

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