Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: TickTack en 28 Abril 2017, 10:58 am



Título: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 28 Abril 2017, 10:58 am
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


Título: Re: Boton favorito de Mozilla Firefox
Publicado por: Serapis en 28 Abril 2017, 15:07 pm
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.


Título: Re: Boton favorito de Mozilla Firefox
Publicado por: TickTack en 30 Abril 2017, 19:45 pm
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


Título: Re: Boton favorito de Mozilla Firefox
Publicado por: Eleкtro en 1 Mayo 2017, 03:17 am
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.

  • https://msdn.microsoft.com/en-us/library/system.windows.forms.control.dock(v=vs.110).aspx (https://msdn.microsoft.com/en-us/library/system.windows.forms.control.dock(v=vs.110).aspx)

Saludos!


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 1 Mayo 2017, 20:18 pm
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


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: Serapis en 2 Mayo 2017, 01:13 am

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


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: Eleкtro en 2 Mayo 2017, 05:22 am
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!


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 2 Mayo 2017, 13:50 pm
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
 


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: Eleкtro en 3 Mayo 2017, 00:31 am
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í:
  • Manuales de .NET (http://foro.elhacker.net/net/manuales_de_net-t122607.0.html;msg1960666#msg1960666)

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 (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):
  • Attribute Class (https://msdn.microsoft.com/en-us/library/system.attribute(v=vs.110).aspx)
  • Attributes Tutorial (https://msdn.microsoft.com/en-us/library/aa288454(v=vs.71).aspx)

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 (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 (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. }

(http://i.imgur.com/8OxR6Fk.png)



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:
  • HtmlDocument Events (https://msdn.microsoft.com/en-us/library/system.windows.forms.htmldocument_events(v=vs.110).aspx)
  • HtmlElement Events (https://msdn.microsoft.com/en-us/library/system.windows.forms.htmlelement_events(v=vs.110).aspx)

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

(http://www.iconarchive.com/download/i7084/hopstarter/button/Button-Next.ico) (http://foro.elhacker.net)

...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/ (http://www.elhacker.net/) -el código actual que he compartido en C# no es capaz de obtener la url de esos botones.

¡Saludos!


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: Eleкtro en 4 Mayo 2017, 11:23 am
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:

  • http://stackoverflow.com/a/43762965/1248295

EDITO:
Acabo de encontrar otro código en javascript que funciona mejor:
  • http://stackoverflow.com/a/30423534/1248295
Con eso ya lo tendrías arreglado.

¡Saludos!


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 4 Mayo 2017, 13:57 pm
Hola Elektro,

Citar
¿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.

No, no. Solamente estaba diciendo de mi mismo que no sirvo para programar y que tu te has dado cuenta. Por supuesto que nunca dijiste esto.
Hace unos anos? Yo agregaria hace muchos anos porque es increible tu conocimiento en C#.

Con respecto al codigo, tengo miedo de que tu codigo pudiera modificar algo en el codigo que tengo yo.

Por ejemplo en vez de Form1, yo tengo WBrowser. Ademas yo no agregue esto:

this.Shown += this.Form1_Shown;

Que en mi caso vendria siendo:

this.Shown += this.WBrowser_Shown;

De todos modos, yo lo tengo asi:

Código:
public WBrowser()
        {
            InitializeComponent();
            currentCulture = CultureInfo.CurrentCulture;
        }

Habria problema en hacer esto?:

Código:
public WBrowser() {
            this.InitializeComponent();
            this.Shown += this.Form1_Shown;
            this.webBrowserExtended1.DocumentMouseDown += this.WebBrowserExtended1_DocumentMouseDown;
            currentCulture = CultureInfo.CurrentCulture;
        }

Quizas te podria interesar lo que hasta ahora tengo:

http://www.mediafire.com/file/tcuwqsw6b7nwgzb/WBrowser.cs

Gracias y saludos


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: Eleкtro en 4 Mayo 2017, 15:12 pm
Con respecto al codigo, tengo miedo de que tu codigo pudiera modificar algo en el codigo que tengo yo.

Por ejemplo en vez de Form1, yo tengo WBrowser. Ademas yo no agregue esto:

this.Shown += this.Form1_Shown;

Que en mi caso vendria siendo:

this.Shown += this.WBrowser_Shown;

La clase que mostré Form1 hereda de la clase Form, igual que tu clase WBrowser hereda de la clase Form, son lo mismo, simplemente tienes que usar el nombre de tu clase en vez vez del que yo usé. Evidentemente no tienes que usar la clase que mostré de forma literal, sino adaptarla a la clase que ya tengas.

Habria problema en hacer esto?:
Código:
public WBrowser() {
            this.InitializeComponent();
            this.Shown += this.Form1_Shown;
            this.webBrowserExtended1.DocumentMouseDown += this.WebBrowserExtended1_DocumentMouseDown;
            currentCulture = CultureInfo.CurrentCulture;
        }

No, no hay problema siempre y cuando en esa clase declares el controlador de eventos Form1_Shown y WebBrowserExtended1_DocumentMouseDown.
De todas formas tu clase se llama WBrowser, así que por lógica y estética lo más apropiado sería usar la nomenclatura WBrowser_Shown.

PD: Tienes montado un buen lio de nomenclaturas en esa clase, los controladores de eventos del WebBrowser tienen nombres algo inapropiados y confusos como por ejemplo Form1_DocumentCompleted.
 
¡Saludos!


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 4 Mayo 2017, 15:56 pm
Hola Elektro,

antes que nada, una pregunta acerca de esta liniea:

this.webBrowserExtended1.DocumentMouseDown += this.WebBrowserExtended1_DocumentMouseDown;

De donde es webBrowserExtended1? Porque me aparece este error:

No contiene una definición y no se puede encontrar un método de extensión aceptando un primer argumento de tipo (¿falta una directiva using o una referencia de ensamblado?

Es el error CS1061.

Gracias y saludos

PD.: Soy un desastre. Me falta mucho, mucho, muchisimo para tener un conocimiento mas o menos aceptable.


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: Eleкtro en 4 Mayo 2017, 16:19 pm
De donde es webBrowserExtended1? Porque me aparece este error:

En esta respuesta te mostré la clase WebBrowserExtended...

  • http://foro.elhacker.net/net/boton_favorito_de_mozilla_firefox_y_otras_cosas-t468665.0.html;msg2121077#msg2121077

Por último, el código original traducido a C#:
Código
  1. public class WebBrowserExtended : WebBrowser {
  2. ...

"WebBrowserExtended1" es una instancia de esa clase creada en tiempo de diseño, el equivalente a arrastrar un control WebBrowser a un Form y que se genere un objeto con el nombre "WebBrowser1" de forma automática...

Sencillamente en tu proyecto tienes que reemplazar tu control WebBrowser por el control WebBrowserExtended. ¿Entiendes a lo que me refiero?.

¡Saludos!


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 4 Mayo 2017, 17:03 pm
Hola Elektro,

Citar
el equivalente a arrastrar un control WebBrowser a un Form y que se genere un objeto con el nombre "WebBrowser1" de forma automática...

Ahhh... pero eso ya esto hecho en el WBrowser.Designer:

http://www.mediafire.com/file/oga66r1ug9m3t2u/WBrowser.Designer.cs

Pero hice lo que tu me dijiste. Cambie el control por WebBrowserExtended y uno de los 45 errores que me da es este:

public partial class WebBrowserExtended : Form

Falta el modificador parcial en la declaración de tipo; Existe otra declaración parcial de este tipo

Error CS0260

Gracias y saludos



Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: Eleкtro en 4 Mayo 2017, 17:53 pm
public partial class WebBrowserExtended : Form

¿Esa herencia de donde ha salido y por qué le has añadido el modificador "partial"?.

Me parece que te estás liando, la clase WebBrowserExtended debe heredar de la clase WebBrowser. La clase WebBrowserExtended la copias en tu proyecto tal cual la escribí (solo modifícale el espacio de nombres), luego compilas, y entonces podrás usar el nuevo control WebBrowserExtended en tiempo de diseño de la misma manera que un WebBrowser normal y corriente.


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 4 Mayo 2017, 19:09 pm
Hola Elektro,

Citar
la clase WebBrowserExtended debe heredar de la clase WebBrowser

Asi lo tengo yo.

Citar
La clase WebBrowserExtended la copias en tu proyecto tal cual la escribí (solo modifícale el espacio de nombres)

Asi tambien lo hice.

El problema esta con el otro codigo que me diste. El que tiene que ir WBrowser.cs. Ahi me aparece ese error que te mencione anteriormente.

Gracias y saludos


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: Eleкtro en 4 Mayo 2017, 19:15 pm
Cambie el control por WebBrowserExtended y uno de los 45 errores que me da es este:

Falta el modificador parcial en la declaración de tipo; Existe otra declaración parcial de este tipo

Error CS0260

El problema esta con el otro codigo que me diste. El que tiene que ir WBrowser.cs. Ahi me aparece ese error que te mencione anteriormente.

No estoy completamente seguro ya que no me conozco al pie de la letra los mensajes de error del compilador de C# en Español (yo trabajo el VS en Inglés) pero ese error parece indicar una ambiguación entre dos clases declaradas sin el modificador "partial", pero sin más información no sé por que te sale ese error.

Si no es mucha molestia muestrame el código fuente entero de la clase WBrowser.cs (otra vez, para ver los cambios que has hecho) e indícame la linea exacta donde salta ese error de compilación.

¡Saludos!


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 4 Mayo 2017, 19:29 pm
Hola Elektro,

el codigo es ese que te pase, a saber, http://www.mediafire.com/file/tcuwqsw6b7nwgzb/WBrowser.cs

El problema surge en la linea 16.


Gracias y saludos


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: Eleкtro en 4 Mayo 2017, 19:35 pm
  • https://msdn.microsoft.com/en-us/library/588zwc2k.aspx

Ahí te explica el motivo. En teoría es por una ambiguación de nomenclaturas, supuestamente tienes dos o más clases declaradas con el mismo nombre "WBrowser" en el mismo espacio de nombres. Para solucionarlo debes añadirle el modificador "partial" a todas las declaraciones de esas clases.

¡Saludos!


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 4 Mayo 2017, 19:49 pm
Hola Elektro,

pero solo me pasaba cuando cambie el control WebBrowser por el control WebBrowserExtended.

Si yo en esto:

Código:
public partial class WBrowser : Form
    {
        public static String favXml = "favorits.xml", linksXml = "links.xml";
        String settingsXml="settings.xml", historyXml="history.xml";
        List<String> urls = new List<String>();
        XmlDocument settings = new XmlDocument();
        String homePage;
        CultureInfo currentCulture;

        public WBrowser()
        {
            InitializeComponent();
            currentCulture = CultureInfo.CurrentCulture;
        }

Le agrego solamente esto:

Código:
public partial class WBrowser : Form
    {
        public static String favXml = "favorits.xml", linksXml = "links.xml";
        String settingsXml="settings.xml", historyXml="history.xml";
        List<String> urls = new List<String>();
        XmlDocument settings = new XmlDocument();
        String homePage;
        CultureInfo currentCulture;

        public WBrowser()
        {
            InitializeComponent();
            this.Shown += this.WBrowser_Shown;
            currentCulture = CultureInfo.CurrentCulture;
        }

Me aparece el error CS1061, que seria:

C# does not contain a definition for and no extension method accepting a first argument of type could be found (are you missing a using directive or an assembly reference?

Necesito eso en mi caso:?

this.Shown += this.WBrowser_Shown;

Porque el Formulario se muestra cuando le doy click a iniciar.

Gracias y saludos


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: Eleкtro en 4 Mayo 2017, 20:54 pm
Necesito eso en mi caso:?

this.Shown += this.WBrowser_Shown;

Vamos a ver, TickTack, ¿me estás diciendo que te intentas asociar al evento Form.Shown para hacer lo que yo hago en el código que te mostré?, entonces básicamente me estás preguntando qué si esto es necesario?:

Código
  1. namespace WindowsFormsApplication1 {
  2.  
  3.    public partial class Form1 : Form {
  4.  
  5.        public Form1() {
  6.            this.InitializeComponent();
  7.            this.Shown += this.Form1_Shown;
  8.            this.webBrowserExtended1.DocumentMouseDown += this.WebBrowserExtended1_DocumentMouseDown;
  9.        }
  10.  
  11.        private void Form1_Shown(object sender, EventArgs e) {
  12.            // Cargo una página web aleatoria...
  13.            this.webBrowserExtended1.Navigate("http://foro.elhacker.net/");
  14.        }

No, no es necesario, y esta asociación de evento this.Shown += this.WBrowser_Shown; en tu caso no hay motivo para hacerlo.

Como puedes ver a simple vista yo solo me subscribo al evento Form.Shown para navegar hacia esta url:
Código
  1. this.webBrowserExtended1.Navigate("http://foro.elhacker.net/");
...y así poder demostrar el funcionamiento de la clase ExtendedWebBrowser en el resto del código de esa clase Form1.

¡Saludos!


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 5 Mayo 2017, 11:08 am
Hola Elektro,

mira, el codigo que me pasaste:

Código:
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;
            }
 
        }

De donde sacaste eso:?

if (!string.IsNullOrWhiteSpace(url))

Porque me dice string no tiene una deficion IsNullOrWhiteSpace.

Gracias y saludos


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 5 Mayo 2017, 11:26 am
Pero que cono?

Le haces referencia a una propiedad de mscorlib.dll?

Ya has probado el codigo en tu Visual Studio?

Sabias que no se puede?

http://stackoverflow.com/questions/42571969/system-dllnotfoundexception-mscorlib-dll



Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: Eleкtro en 5 Mayo 2017, 17:19 pm
De donde sacaste eso:?

if (!string.IsNullOrWhiteSpace(url))

Es uno de los miembros built-in más básicos y útiles que se debe aprender en la programación .NET.

  • String.IsNullOrWhiteSpace Method | MSDN (https://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp)



Porque me dice string no tiene una deficion IsNullOrWhiteSpace.

Por que probablemente estás compilando a la versión 3.5 o inferior de .NET Framework (¿o tal vez 4.0 Compact?) y por ende no se puede encontrar esa función, puesto que la función String.IsNullOrWhiteSpace() se implementó en la versión 4.0 de .NET Framework.

Tienes varias formas de solucionarlo, la primera y más sencilla (y la más compatible) sería cambiar la versión objetivo de .NET Framework (a la versión 4.0 o superior) en las propiedades de tu proyecto. O sino, siempre puedes utilizar la función String.IsNullOrEmpty() en su lugar, aunque esto no aporta la misma capa de seguridad. También puedes implementar tu propia función IsNullOrWhiteSpace, puedes buscar ejemplos en Google.



Ya has probado el codigo en tu Visual Studio?

¿Tú me ves alguien capaz de compartir un código y decir que funciona, sin haberlo probado y verificar que realmente es funcional?. Los problemas que tienes son por inexperiencia/falta de comprensión, no por mi culpa.

Pero que cono?

Le haces referencia a una propiedad de mscorlib.dll?

Sabias que no se puede?

http://stackoverflow.com/questions/42571969/system-dllnotfoundexception-mscorlib-dll

Estás cometiendo un error garrafal. Para empezar, todo eso que acabas de decir y de la forma en la que lo has dicho es un completo sin sentido, ¿entiendes lo que es una referencia, una propiedad, la librería mscorlib.dll y el papel que ésta juega en el CLR de .NET Framework?, por que para hablarme de esa manera primero deberías cerciorarte de lo que hablas.

Te pones a intentar culpar y cuestionar a alguien que solo intenta ayudarte... ¿por el mero hecho de que algo no te funcione, y criticándome por haber cometido supuestos errores?. Evidentemente podría haber tenido un error (que no es el caso), por que no soy perfecto, pero en tal caso creo que habría otras formas de comunicármelo, ¿no?. Mira, antes de decir tonterías sin sentido, en lugar de eso mejor deberías limitarte a preguntar "¿por qué esto no me funciona?", y así yo te puedo explicar cual es el fallo sin hacerme enfadar.

Al principio de este comentario ya te he explicado por qué te ocurre lo que te ocurre, y te he explicado también como lo puedes solucionar, eso es todo lo que necesitas saber.

Saludos.


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 5 Mayo 2017, 22:43 pm
Hola Elektro,

Citar
Los problemas que tienes son por inexperiencia/falta de comprensión, no por mi culpa.

Por supuesto que si. :)

Citar
Estás cometiendo un error garrafal. Para empezar, todo eso que acabas de decir y de la forma en la que lo has dicho es un completo sin sentido, ¿entiendes lo que es una referencia, una propiedad, la librería mscorlib.dll y el papel que ésta juega en el CLR de .NET Framework?

En cuanto a saber lo que es una referencia, una propiedad y la libreria mscorlib.dll, si, si se lo que es.
En cuanto al papel que estos juegan en el CLR de .NET Framework, no, no se que papel juegan. Es mas, no se que es CLR. Y tampoco se a lo que te refieres con .NET Framework.

Citar
por que para hablarme de esa manera primero deberías cerciorarte de lo que hablas.

Te pones a intentar culpar y cuestionar a alguien que solo intenta ayudarte... ¿por el mero hecho de que algo no te funcione, y criticándome por haber cometido supuestos errores?. Evidentemente podría haber tenido un error (que no es el caso), por que no soy perfecto, pero en tal caso creo que habría otras formas de comunicármelo, ¿no?. Mira, antes de decir tonterías sin sentido, en lugar de eso mejor deberías limitarte a preguntar "¿por qué esto no me funciona?", y así yo te puedo explicar cual es el fallo sin hacerme enfadar.

Al principio de este comentario ya te he explicado por qué te ocurre lo que te ocurre, y te he explicado también como lo puedes solucionar, eso es todo lo que necesitas saber.

Bueno. El hecho de que te pregunte de donde sacaste eso me dices que te ofendi, que te critique, que te dije que tu eres el culpable?
Si te hubiera dicho: "De donde sacaste este mier**, que no funciona?". Eso si que seria ofenderte.

Yo dije: "Pero que cono?". Te sientes ofendido por eso? Porque no comprendo algo?
Nota que no escribi: "Pero que cono hiciste?".

Es mas, mira:
Citar
deberías limitarte a preguntar "¿por qué esto no me funciona?

No fue eso lo que hice?

Citar
Porque me dice string no tiene una deficion IsNullOrWhiteSpace.

Amigo. No te sientas ofendido. Quiza mi manera de expresarme te dio la impresion de querer ofenderte.

Ahora
Citar
Los problemas que tienes son por inexperiencia/falta de comprensión, no por mi culpa.

Citar
por que para hablarme de esa manera primero deberías cerciorarte de lo que hablas.

Citar
Mira, antes de decir tonterías sin sentido

No soy yo, mas bien, el que tiene razon para estar enfadado, y que, sin embargo, no lo estoy? Sin agregar que podria arriesgarme a ser baneado?

Bueno. Hice el metodo de IsNullOrWhiteSpace:

Código
  1. public static bool IsNullOrWhiteSpace(string value)
  2.        {
  3.            if (value != null)
  4.            {
  5.                for (int i = 0; i < value.Length; i++)
  6.                {
  7.                    if (!char.IsWhiteSpace(value[i]))
  8.                    {
  9.                        return false;
  10.                    }
  11.                }
  12.            }
  13.            return true;
  14.        }
  15.  

Modifique un poco el codigo que me pasaste:

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

Como vez, le puse esto:

Código:
addNewTab();
                                getCurrentBrowser().Navigate(uri);

Esto seria abrir una nueva Tab y abrir la URL.

Pero realmente no funciona. Visual Studio no me da error. Mi navegador se carga satisfactoriamente. Pero el codigo no me funciona.
Por supuesto, seguramente hice algo mal. Porque tu dijiste que lo probaste. Tienes alguna idea que error hice esta vuelta de nuevo.
O escribi una cosa que no tiene sentido de vuelta? No lo digo ironicamente. Yo aprendi a no enfandarme. Por favor dime. Para que tenga la posibilidad de mejorarme en el futuro.

Gracias y saludos

PD.: Perdon por los malentendidos.  :)


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: Eleкtro en 6 Mayo 2017, 11:21 am
Pero realmente no funciona. Visual Studio no me da error. Mi navegador se carga satisfactoriamente. Pero el codigo no me funciona.

No puedo saber que significa "no funciona" si no das más detalles. ¿Has comprobado si el bloque de código del controlador WebBrowserExtended1_DocumentMouseDown se llega a ejecutar?.

He probado el código con tu implementación de la función String.IsNullOrWhiteSpace, con las modificaciones que le has hecho al controlador de evento WebBrowserExtended1_DocumentMouseDown, y en mi caso funciona, así que lo único que se me ocurre es que no hallas asociado el evento WebBrowserExtended.DocumentMouseDown...

Código
  1. this.WebBrowserExtended1.DocumentMouseDown += this.WebBrowserExtended1_DocumentMouseDown;

Saludos


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 6 Mayo 2017, 14:16 pm
Hola Elektro,

si asocio el evento WebBrowserExtended.DocumentMouseDown me da el siguiente error:

WBrowser does not contain a definition for WebBrowserExtendedd1 and no WebBrowserExtended1 extension method accepting a first argument of type WebBrowser could be found (are you missing a using directive or an assembly reference?)

Gracias y saludos


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: Eleкtro en 6 Mayo 2017, 14:49 pm
No debería haberte mostrado ningún código por que no ha servido de nada si no comprendes como utilizarlo, debería haberme limitado a decirte que lo que debes hacer antes que nada es leer un tutorial básico de C# hasta que aprendas a manejar conceptos básicos como instancias de clase, objetos/referencias y eventos.

Podriamos estar así un siglo explicándote cada intento fallido de hacerlo funcionar, pero no me apetece explicar más, lo siento, por que para utilizar un código en el que basicamente solo hay que copiar y pegar para testearlo, le estás dando 2.000 vueltas de forma complicada por no comprender como se puede usar. Y para colmo luego me culpas a mi de que no te vaya por "estar haciendo las cosas mal", cuando yo no hice nada mal en ese código, pero bueno, no volveré a ese tema...



WBrowser does not contain a definition for WebBrowserExtendedd1 and no WebBrowserExtended1 extension method accepting a first argument of type WebBrowser could be found (are you missing a using directive or an assembly reference?)

Veamos, te explico, pero esto será lo último que te explicaré en este post:

Para asociar un evento expuesto en una clase, primero debes crear una instancia de la clase, en este caso sería una instancia de la clase/control WebBrowserExtended, entonces declaras un objeto para mantener una referencia de esa clase, y le pones el nombre que quieras al objeto. ¿Y cómo se hace todo eso?, pues así:

Código
  1. WebBrowserExtended miObjeto = new WebBrowserExtended();

Y entonces, teniendo la referencia, ya puedes asociar el evento WebBrowserExtended.DocumentMouseDown al controlador de evento, que en este caso se llama WebBrowserExtended1_DocumentMouseDown:

Código
  1. this.miObjeto.DocumentMouseDown += this.WebBrowserExtended1_DocumentMouseDown;

Y todo esto que acabo de explicar se puede resumir y hacer de un modo muy distinto e igual de sencillo: debes reemplazar las instancias del control WebBrowser por WebBrowserExtended en tu clase del diseñador, XXXX.Designer.cs.
Desde el principio no ha tenido más misterio lo que debes hacer, tan solo en tu código reemplaza el uso del WebBrowser por el nuevo control WebBrowserExtended, como te llevo diciendo desde un principio, y luego asociar el evento WebBrowserExtended.DocumentMouseDown donde implementarías la funcionalidad de obtener la url... cosa que ya te mostré como hacerlo en otro ejemplo.

Saludos.


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 6 Mayo 2017, 18:55 pm
No debería haberte mostrado ningún código por que no ha servido de nada si no comprendes como utilizarlo, debería haberme limitado a decirte que lo que debes hacer antes que nada es leer un tutorial básico de C# hasta que aprendas a manejar conceptos básicos como instancias de clase, objetos/referencias y eventos.

Podriamos estar así un siglo explicándote cada intento fallido de hacerlo funcionar, pero no me apetece explicar más, lo siento, por que para utilizar un código en el que basicamente solo hay que copiar y pegar para testearlo, le estás dando 2.000 vueltas de forma complicada por no comprender como se puede usar. Y para colmo luego me culpas a mi de que no te vaya por "estar haciendo las cosas mal", cuando yo no hice nada mal en ese código, pero bueno, no volveré a ese tema...

Joder. A la mier** con C#. A la mier** con todo realmente. Si no queres o te has cansado o estas incontento de que no te pagan entonces no me ayudes NUNCA MAS.

Aqui nadie te dijo que me ayudaras. Ademas felicitarte que hayas llegado hasta aqui. Ya que realmente ningun admnistrador llega hasta aqui. Normalmente los admins son orgullosos de una forma negativa. Se creen los intocables.

Ya deja de responder entonces mis posts. Deja que otro que no se queje ni sea tan hibersensible como tu me ayude. A menos que esto haya sido realmente fuerte para ti te lleve a que me banees o que me hagas otro cosa desagradante.


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 7 Mayo 2017, 10:24 am
Hola,

finalmente tras tener una crisis conmigo mismo logre solucionar el problema de abrir una pagina en otro tab. Tambien le puse nuevas cosas. Pero con esto me detuve ya que es algo mas avanzado creo:

Cuando uno deja presionado el mouse en el boton de Mozilla Firefox que sirve para ir hacia atras, se muestra un pequeno historial.

Alguien tiene una idea de como poder hacer esto con C#?

Gracias y saludos


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: Serapis en 8 Mayo 2017, 01:40 am
Estoy con Electro... y no deberías enfadarte.

Si no sabes lo que es una simple pila ni como instanciarla, usarla o construirla tú mismo, no tiene sentido que quieras hacer cosas más complejas.

Es absurdo querer construir un avión, cuando uno no sabe siquiera lo que es un tornillo. No puedes crear un proyecto, preguntando absolutamente todo, aunque te enfades, lo correcto es que antes aprendas un poco a fondo, al menos la base del lenguaje en que quieres programarlo. Un foro está para hacer preguntas puntuales, dudas concretas, no para resolver proyectos completos... a algo construído así, no puede uno sentirse autor, pon de tu parte y estudia lo elemental, entonces todo el mundo entenderá que tengas una duda con alguna cosa concreta, pero cuando se tienen dudas con cosas elementales, la respuesta no puede ser otra, que estudiaes lo básico y elemental... Si tu pereza te impide perder tiempo, en ello, tampoc parece justo que pidas que los demás cedan de su tiempo.

Básicamente se ayuda al que se esmera, no al que no quiere molestarse en aprender lo básico... ¿Cómo vas a perder tiempo explicando a un indio perdido en una tribu como funciona un avión, si no conoce siquiera el fuego, la palanca, la rueda, ni el tornillo?. Aprende lo elemental de un lenguaje.


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 8 Mayo 2017, 22:24 pm
Estoy con Electro... y no deberías enfadarte.

Si no sabes lo que es una simple pila ni como instanciarla, usarla o construirla tú mismo, no tiene sentido que quieras hacer cosas más complejas.

Es absurdo querer construir un avión, cuando uno no sabe siquiera lo que es un tornillo. No puedes crear un proyecto, preguntando absolutamente todo, aunque te enfades, lo correcto es que antes aprendas un poco a fondo, al menos la base del lenguaje en que quieres programarlo. Un foro está para hacer preguntas puntuales, dudas concretas, no para resolver proyectos completos... a algo construído así, no puede uno sentirse autor, pon de tu parte y estudia lo elemental, entonces todo el mundo entenderá que tengas una duda con alguna cosa concreta, pero cuando se tienen dudas con cosas elementales, la respuesta no puede ser otra, que estudiaes lo básico y elemental... Si tu pereza te impide perder tiempo, en ello, tampoc parece justo que pidas que los demás cedan de su tiempo.

Básicamente se ayuda al que se esmera, no al que no quiere molestarse en aprender lo básico... ¿Cómo vas a perder tiempo explicando a un indio perdido en una tribu como funciona un avión, si no conoce siquiera el fuego, la palanca, la rueda, ni el tornillo?. Aprende lo elemental de un lenguaje.

Bueno. Justo vino visita y se fue el texto que queria escribir. Escribo:

Yo se lo que es una pila. Ya he trabajado con pilas en C# anteriormente.

No exageres con la comparacion del avion. Porque no puedo preguntarlo todo? Se cansan en ayudarme? Resolver proyectos completos... porque no me pueden ayudar en eso? Yo ya puse de mi parte. El navegador no lo hicieron ustedes completamente. En mi navegador hay muchas mas funciones que capturar elementos html. Ademas... quien dice que me sentiria autor? Estaba pensando en hacer un tutorial en el futuro y darle el credito a Elektro en la parte "Capturar elementos HTML con la rueda del mouse". Yo cedo de mi tiempo para ayudar a otros aca (si puedo hacerlo en lo que respecta a conocimiento). Cedi a estudiar y a limpiar mi casa. Yo no pido de ustedes lo mismo. Lo que yo pido es paciencia.

Ayudenme, que me esmero muchachos. O no lo ven que me esmero muchachos?

Citar
¿Cómo vas a perder tiempo explicando a un indio perdido en una tribu como funciona un avión, si no conoce siquiera el fuego, la palanca, la rueda, ni el tornillo?.

Como? Con paciencia.

Saludos!


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: MCKSys Argentina en 9 Mayo 2017, 00:13 am
Bueno, no conozco mucho de .NET (la verdad, he programado un par de cosas triviales), pro he encontrado que los botones que se comportan como comboboxes se llaman SplitButton (http://stackoverflow.com/questions/10171645/combobox-like-a-button)

Hay un par de ejemplos de cómo hacerlos:

https://www.codeproject.com/Articles/18447/SplitButton-a-NET-WinForm-control-Part-1 (https://www.codeproject.com/Articles/18447/SplitButton-a-NET-WinForm-control-Part-1)
https://www.codeproject.com/Articles/15627/SplitButton-an-XP-style-dropdown-split-button (https://www.codeproject.com/Articles/15627/SplitButton-an-XP-style-dropdown-split-button)
https://wyday.com/splitbutton/ (https://wyday.com/splitbutton/)

No he mirado lo anterior, pero creo que faltaría el delay entre el click y el dropdown del combo (la aparición del mismo).

Espero te sea útil.

Saludos!


Título: Re: Boton favorito de Mozilla Firefox y otras cosas
Publicado por: TickTack en 9 Mayo 2017, 14:37 pm
Bueno, no conozco mucho de .NET (la verdad, he programado un par de cosas triviales), pro he encontrado que los botones que se comportan como comboboxes se llaman SplitButton (http://stackoverflow.com/questions/10171645/combobox-like-a-button)

Hay un par de ejemplos de cómo hacerlos:

https://www.codeproject.com/Articles/18447/SplitButton-a-NET-WinForm-control-Part-1 (https://www.codeproject.com/Articles/18447/SplitButton-a-NET-WinForm-control-Part-1)
https://www.codeproject.com/Articles/15627/SplitButton-an-XP-style-dropdown-split-button (https://www.codeproject.com/Articles/15627/SplitButton-an-XP-style-dropdown-split-button)
https://wyday.com/splitbutton/ (https://wyday.com/splitbutton/)

No he mirado lo anterior, pero creo que faltaría el delay entre el click y el dropdown del combo (la aparición del mismo).

Espero te sea útil.

Saludos!

Ohh. Excelente!!  ::)

Muchas gracias!!  :)