Inicie el navegador web predeterminado, pero no si la URL ya está abierta

Tengo un enlace en la interfaz de usuario de mi aplicación que inicia una URL usando System.Diagnostics.Process.Start(). Si el usuario hace clic en el enlace varias veces, se abren varias pestañas.

¿Hay alguna forma, tal vez una opción de línea de comandos, de seguir usando el navegador web predeterminado, pero hacer que vuelva a abrir la misma pestaña si la URL ya está abierta? Estaría bien si no funciona con todos los navegadores posibles, pero bueno si al menos funciona con IE, Firefox y Chrome.

Lo dudo, pero como no vi ninguna otra pregunta/respuesta sobre este tema, pensé en preguntar.

preguntado el 22 de mayo de 12 a las 16:05

1 Respuestas

Esto es algo así como una solución, pero podría ayudarlo a comenzar. He usado System.Diagnostics.Process.ProcessId. Como ejemplo, he usado IE, luego explicaré por qué hice esto. El código es simplemente "rápido y sucio", pero lo hice como prueba de concepto.

Creé una aplicación básica de WinForm con un botón que abrirá Google en IE, si la aplicación ya lo abrió, no se volverá a abrir.

Agregué la referencia System.Diagnostics.

    public int ProcessID;
    public Form1()
    {
        InitializeComponent();
    }
    private void MyButton_Click(object sender, EventArgs e)
    {
        if (ProcessID == null)
        {
            StartIE();
        }
        else
        {
            if (!ProcessIsRunning())
            {
                StartIE();
            }
        }
    }
    private bool ProcessIsRunning()
    {
        bool ProcessRunning = false;
        foreach (Process p in Process.GetProcesses())
        {
            try
            {
                if (p.Id == ProcessID)
                {
                    ProcessRunning = true;
                }
            }
            catch { }
        }
        return ProcessRunning;
    }
    private void StartIE()
    {
        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.StartInfo.FileName = "iexplore.exe";
        proc.StartInfo.Arguments = "http://www.google.be";
        proc.Start();
        ProcessID = proc.Id;
    }

Esto no hace completamente lo que solicitó, pero podría ser un buen comienzo. Hay algunas razones por las que lo hice de esta manera y cuáles son las posibles opciones.

  • Si usara la URL como nombre de archivo, de hecho abriría la página web en el navegador predeterminado, sin embargo, no devolvería un ID de proceso. Esta es la razón por la que el fragmento muestra el uso de IE. (Si usaría esta opción, podría usar System.IO.File.Exists para asegurarse de que el navegador deseado esté instalado)
  • Si desea utilizar esta opción, puede consultar el registro para seleccionar cuál es el navegador predeterminado, si lo tiene, puede iniciarlo a partir del valor obtenido del registro. Si luego cambia process.startinfo.filename a este valor, iniciará el navegador predeterminado pero aún obtendrá un ID de proceso, por lo que este podría ser el camino a seguir. Puedes comprobar cómo hacerlo aquí: http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/b200903e-ce69-4bd4-a436-3e20a7632dc4
  • Se puede mostrar la ventana de Internet si ya está abierta mediante la propiedad SetForegroundWindow. Como esto ya está documentado en este artículo, no lo agregué en este fragmento.

Espero que esto te ayude a seguir tu camino.

contestado el 23 de mayo de 17 a las 12:05

Buena solución, gracias! Dado que IE usa un nuevo proceso para cada pestaña (generalmente), esto podría incluso rastrear solo la pestaña que abrió. Por supuesto, esa pestaña podría tener algún otro sitio web abierto, pero esta es una respuesta tan buena como cualquier otra, ya que no hay una respuesta simple. Probablemente tendría que ir a OLE/COM para llevar esto aún más lejos, pero de todos modos no es lo que estoy buscando (el problema no vale tanto esfuerzo). - eselk

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.