Boton favorito de Mozilla Firefox y otras cosas

Iniciado por TickTack, 28 Abril 2017, 10:58 AM

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

TickTack

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
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

Serapis

#1
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.

TickTack

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:


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
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

Eleкtro

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!








TickTack

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
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

Serapis

#5
Cita de: TickTack en  1 Mayo 2017, 20:18 PM

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).

Eleкtro

#6
Cita de: TickTack en  1 Mayo 2017, 20:18 PMPero 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 (vbnet) [Seleccionar]
public class WebBrowserExtended : WebBrowser {
public WebBrowserExtended() {}
}

...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 (vbnet) [Seleccionar]
<DisplayName("WebBrowserExtended")>
<Description("A extended WebBrowser control.")>
<DesignTimeVisible(True)>
<DesignerCategory("UserControl")>
<ToolboxBitmap(GetType(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")>
Public Class WebBrowserExtended : Inherits WebBrowser

#Region " Private Fields "

   ' Keeps an event-suitable reference of the current WebBrowser.Document instance.
   Private WithEvents doc As HtmlDocument

   ' Keeps an event-suitable reference of the current WebBrowser.Document.Body instance.
   Private WithEvents body As HtmlElement

#End Region

#Region " Events "

   Public Event DocumentMouseDown As EventHandler(Of HtmlElementEventArgs)
   Public Event DocumentMouseUp As EventHandler(Of HtmlElementEventArgs)

   Public Event BodyMouseDown As EventHandler(Of HtmlElementEventArgs)
   Public Event BodyMouseUp As EventHandler(Of HtmlElementEventArgs)

#End Region

#Region " Constructors "

   <DebuggerNonUserCode>
   Public Sub New()
       Me.ScriptErrorsSuppressed = True
   End Sub

#End Region

#Region " Event Invocators "

   Protected Overridable Sub OnDocumentMouseDown(ByVal e As HtmlElementEventArgs)
       If (Me.DocumentMouseDownEvent IsNot Nothing) Then
           RaiseEvent DocumentMouseDown(Me, e)
       End If
   End Sub

   Protected Overridable Sub OnDocumentMouseUp(ByVal e As HtmlElementEventArgs)
       If (Me.DocumentMouseUpEvent IsNot Nothing) Then
           RaiseEvent DocumentMouseUp(Me, e)
       End If
   End Sub

   Protected Overridable Sub OnBodyMouseDown(ByVal e As HtmlElementEventArgs)
       If (Me.BodyMouseDownEvent IsNot Nothing) Then
           RaiseEvent BodyMouseDown(Me, e)
       End If
   End Sub

   Protected Overridable Sub OnBodyMouseUp(ByVal e As HtmlElementEventArgs)
       If (Me.BodyMouseUpEvent IsNot Nothing) Then
           RaiseEvent BodyMouseUp(Me, e)
       End If
   End Sub

#End Region

#Region " Event Handlers "

   Private Sub WebBrowser_Navigated(ByVal sender As Object, ByVal e As WebBrowserNavigatedEventArgs) Handles Me.Navigated
       Me.doc = Me.Document
       Me.body = Me.Document.Body
   End Sub

   Private Sub WebBrowser_Document_MouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs) Handles doc.MouseDown
       Me.OnDocumentMouseDown(e)
   End Sub

   Private Sub WebBrowser_Document_MouseUp(ByVal sender As Object, ByVal e As HtmlElementEventArgs) Handles doc.MouseUp
       Me.OnDocumentMouseUp(e)
   End Sub

   Private Sub WebBrowser_Body_MouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs) Handles body.MouseDown
       Me.OnBodyMouseDown(e)
   End Sub

   Private Sub WebBrowser_Body_MouseUp(ByVal sender As Object, ByVal e As HtmlElementEventArgs) Handles body.MouseUp
       Me.OnBodyMouseUp(e)
   End Sub

#End Region

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 (vbnet) [Seleccionar]
Public Class Form1

   Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Shown
       ' Cargo una página web aleatoria...
       Me.WebBrowserExtended1.Navigate("http://foro.elhacker.net/")
   End Sub

   Private Sub WebBrowserExtended1_DocumentMouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs) Handles WebBrowserExtended1.DocumentMouseDown

       ' Creo una referencia corta de nuestro WebBrowser.
       Dim wb As WebBrowserExtended = DirectCast(sender, WebBrowserExtended)

       Select Case e.MouseButtonsPressed

           ' El botón central del ratón se ha pulsado.
           Case MouseButtons.Middle

               ' Obtengo el elemento Html que esté situadio en las coordenadas actuales del puntero del ratón.
               Dim element As HtmlElement = wb.Document.GetElementFromPoint(e.ClientMousePosition)
               ' Comprobación de seguridad.
               If (element IsNot Nothing) Then
                   ' Obtengo el atributo href que contiene la url destino.
                   ' Nótese que esto no funcionará con todo tipo de elementos,
                   ' eso requiere una implementación/análisis/parsing más sofisticado sobre el elemento obtenido, y no es mi tarea hacer eso,
                   ' pero esta metodología cubre la gran mayoría, que es lo que importa para poder extender este ejemplo funcional.
                   Dim url As String = element.GetAttribute("href")
                   ' Comprobación de seguridad.
                   If Not String.IsNullOrWhiteSpace(url) Then
                       Dim uri As Uri = Nothing
                       ' Antes de hacer nada más, compruebo que la url es realmente una url válida.
                       If (Uri.TryCreate(url, UriKind.RelativeOrAbsolute, uri)) Then
                           ' Desactivo temporálmente la navegación de este WebBrowser;
                           ' esto es como decirle: "no hagas nada, que yo me encargo de controlar el evento del ratón".
                           wb.AllowNavigation = False
                           ' Finálmente, aquí podemos hacer lo que queramos con la url obtenida. Por ejemplo:
                           Otro_WebBrowser.Navigate(uri)
                       Else
                           ' La supuesta url no tiene una sintaxis válida.
                           ' Se puede ignorar, o controlar y considerarlo como error.
                       End If ' uri
                   End If ' url
               End If ' element

           Case Else
               ' Si se ha pulsado un botón distinto al botón central del ratón,
               ' entonces habilito la navegación del WebBrowser para que controle el evento y navegue a la nueva url.
               wb.AllowNavigation = True

       End Select

   End Sub

End Class





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

Código (csharp) [Seleccionar]
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {

   [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")]
   public class WebBrowserExtended : WebBrowser {

       #region " Properties "

       // Keeps an event-suitable reference of the current WebBrowser.Document instance.
       private HtmlDocument Doc {
           get { return this.docB; }
           set {
               if (this.docB != null) {
                   this.docB.MouseDown -= this.WebBrowser_Document_MouseDown;
                   this.docB.MouseUp -= this.WebBrowser_Document_MouseUp;
               }
               this.docB = value;
               if (this.docB != null) {
                   this.docB.MouseDown += this.WebBrowser_Document_MouseDown;
                   this.docB.MouseUp += this.WebBrowser_Document_MouseUp;
               }
           }
       }
       private HtmlDocument docB; // Backing field.

       // Keeps an event-suitable reference of the current WebBrowser.Document.Body instance.
       private HtmlElement Body {
           get { return this.bodyB; }
           set {
               if (this.bodyB != null) {
                   this.bodyB.MouseDown -= this.WebBrowser_Body_MouseDown;
                   this.bodyB.MouseUp -= this.WebBrowser_Body_MouseUp;
               }
               this.bodyB = value;
               if (this.bodyB != null) {
                   this.bodyB.MouseDown += this.WebBrowser_Body_MouseDown;
                   this.bodyB.MouseUp += this.WebBrowser_Body_MouseUp;
               }
           }
       }
       private HtmlElement bodyB; // Backing field.

       #endregion

       #region " Events "

       public event EventHandler<HtmlElementEventArgs> DocumentMouseDown;
       public event EventHandler<HtmlElementEventArgs> DocumentMouseUp;

       public event EventHandler<HtmlElementEventArgs> BodyMouseDown;
       public event EventHandler<HtmlElementEventArgs> BodyMouseUp;

       #endregion

       #region " Constructors "

       [DebuggerNonUserCode()]
       public WebBrowserExtended() {
           this.Navigated += this.WebBrowser_Navigated;
           this.ScriptErrorsSuppressed = true;
       }

       #endregion

       #region " Event Invocators "

       protected virtual void OnDocumentMouseDown(HtmlElementEventArgs e) {
           this.DocumentMouseDown?.Invoke(this, e);
       }

       protected virtual void OnDocumentMouseUp(HtmlElementEventArgs e) {
           this.DocumentMouseUp?.Invoke(this, e);
       }

       protected virtual void OnBodyMouseDown(HtmlElementEventArgs e) {
           this.BodyMouseDown?.Invoke(this, e);
       }

       protected virtual void OnBodyMouseUp(HtmlElementEventArgs e) {
           this.BodyMouseUp?.Invoke(this, e);
       }

       #endregion

       #region " Event Handlers "

       private void WebBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e) {
           this.Doc = this.Document;
           this.Body = this.Document.Body;
       }

       private void WebBrowser_Document_MouseDown(object sender, HtmlElementEventArgs e) {
           this.OnDocumentMouseDown(e);
       }

       private void WebBrowser_Document_MouseUp(object sender, HtmlElementEventArgs e) {
           this.OnDocumentMouseUp(e);
       }

       private void WebBrowser_Body_MouseDown(object sender, HtmlElementEventArgs e) {
           this.OnBodyMouseDown(e);
       }

       private void WebBrowser_Body_MouseUp(object sender, HtmlElementEventArgs e) {
           this.OnBodyMouseUp(e);
       }

       #endregion

   }
   
}


+

Código (csharp) [Seleccionar]
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {

   public partial class Form1 : Form {

       public Form1() {
           this.InitializeComponent();
           this.Shown += this.Form1_Shown;
           this.webBrowserExtended1.DocumentMouseDown += this.WebBrowserExtended1_DocumentMouseDown;
       }
       
       private void Form1_Shown(object sender, EventArgs e) {
           // Cargo una página web aleatoria...
           this.webBrowserExtended1.Navigate("http://foro.elhacker.net/");
       }

       private void WebBrowserExtended1_DocumentMouseDown(object sender, HtmlElementEventArgs e) {

           // Creo una referencia corta de nuestro WebBrowser.
           WebBrowserExtended wb = (WebBrowserExtended)sender;

           switch (e.MouseButtonsPressed) {

               // El botón central del ratón se ha pulsado.
               case MouseButtons.Middle:

                   // Obtengo el elemento Html que esté situadio en las coordenadas actuales del puntero del ratón.
                   HtmlElement element = wb.Document.GetElementFromPoint(e.ClientMousePosition);
                   // Comprobación de seguridad.
                   if (element != null) {
                       // Obtengo el atributo href que contiene la url destino.
                       // Nótese que esto no funcionará con todo tipo de elementos,
                       // eso requiere una implementación/análisis/parsing más sofisticado sobre el elemento obtenido, y no es mi tarea hacer eso,
                       // pero esta metodología cubre la gran mayoría, que es lo que importa para poder extender este ejemplo funcional.
                       string url = element.GetAttribute("href");
                       // Comprobación de seguridad.
                       if (!string.IsNullOrWhiteSpace(url)) {
                           Uri uri = null;
                           // Antes de hacer nada más, compruebo que la url es realmente una url válida.
                           if (Uri.TryCreate(url, UriKind.RelativeOrAbsolute, out uri)) {
                               // Desactivo temporálmente la navegación de este WebBrowser;
                               // esto es como decirle: "no hagas nada, que yo me encargo de controlar el evento del ratón".
                               wb.AllowNavigation = false;
                               // Finálmente, aquí podemos hacer lo que queramos con la url obtenida. Por ejemplo:
                               Otro_WebBrowser.Navigate(uri);
                           } else {
                               // La supuesta url no tiene una sintaxis válida.
                               // Se puede ignorar, o controlar y considerarlo como error.
                           } // uri
                       } // url
                   }  // element
                   break;

               default:
                   // Si se ha pulsado un botón distinto al botón central del ratón,
                   // entonces habilito la navegación del WebBrowser para que controle el evento y navegue a la nueva url.
                   wb.AllowNavigation = true;
                   break;
           }

       }
       
   }
}


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!








TickTack

Hola NEBIRE,

Estaba pensando en lo mismo que tu pero...

Cita de: NEBIRE en  2 Mayo 2017, 01:13 AM
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:


[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
 
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

Eleкtro

#8
Cita de: TickTack en  2 Mayo 2017, 13:50 PMComo 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.




Cita de: TickTack en  2 Mayo 2017, 13:50 PMEn 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.




Cita de: TickTack en  2 Mayo 2017, 13:50 PMTu 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.




Cita de: TickTack en  2 Mayo 2017, 13:50 PManalise 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.

Cita de: TickTack en  2 Mayo 2017, 13:50 PMQue 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 (csharp) [Seleccionar]
public class MiControl : Control {

[DisplayName("Nombre a mostrar")]
[Description("Descripción a mostrar.")]
public string MiPropiedad { get; set; }

}







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.




Cita de: TickTack en  2 Mayo 2017, 13:50 PMPrimero 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 (csharp) [Seleccionar]
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!








Eleкtro

#9
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!