Winforms 启动默认web浏览器,但如果URL已打开,则不启动

Winforms 启动默认web浏览器,但如果URL已打开,则不启动,winforms,browser,launching-application,Winforms,Browser,Launching Application,我的应用程序界面上有一个链接,它使用System.Diagnostics.Process.Start()启动一个URL。如果用户多次单击该链接,将打开多个选项卡 是否有一种方法(可能是命令行选项)仍然使用默认的web浏览器,但如果URL已打开,则让它重新打开同一选项卡?如果它不适用于所有可能的浏览器,那也没关系,但如果它至少适用于IE、Firefox和Chrome,那就更好了 我对此表示怀疑,但因为我没有看到关于这个话题的任何其他问题/答案,我想我应该问一下。这是一种解决方法,但可能会让你开始。

我的应用程序界面上有一个链接,它使用
System.Diagnostics.Process.Start()
启动一个URL。如果用户多次单击该链接,将打开多个选项卡

是否有一种方法(可能是命令行选项)仍然使用默认的web浏览器,但如果URL已打开,则让它重新打开同一选项卡?如果它不适用于所有可能的浏览器,那也没关系,但如果它至少适用于IE、Firefox和Chrome,那就更好了


我对此表示怀疑,但因为我没有看到关于这个话题的任何其他问题/答案,我想我应该问一下。

这是一种解决方法,但可能会让你开始。我已使用System.Diagnostics.Process.ProcessId。 作为我使用IE的一个例子,我将在后面解释我为什么这样做。代码只是“快速和肮脏”,但我只是把它作为概念的证明

我已经创建了一个基本的WinForm应用程序,其中有一个按钮可以在IE中打开google,如果应用程序已经打开它,它将不会再次打开

我添加了系统。诊断参考

    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;
    }
这并不能完全满足您的要求,但这可能是一个良好的开端。我这样做有几个原因,还有哪些可能的选择

  • 如果使用url作为文件名,它确实会在默认浏览器中打开网页,但不会返回processID。这就是代码段显示IE用法的原因。(如果要使用此选项,可以使用System.IO.File.Exists来确保安装了所需的浏览器)
  • 如果您想使用此选项,您可以查询注册表以选择默认浏览器是什么,如果您有,您可以从注册表中获得的值启动默认浏览器。如果随后将process.startinfo.filename更改为该值,则将启动默认浏览器,但仍将获得processId,因此这可能是前进的方向。您可以在此处查看如何执行此操作:
  • 如果internet窗口已经打开,则可以使用SetForeGroundIndow属性显示该窗口。由于这已经在中进行了记录,所以我没有将其添加到此代码段中

我希望这能帮助您上路。

好的解决方案,谢谢!由于IE对每个标签都使用了一个新的过程(通常),这甚至可能只跟踪您打开的标签。当然,该选项卡可能会打开其他网站,但这是一个很好的答案,因为没有简单的答案。可能需要使用OLE/COM才能更进一步,但这并不是我想要的(这个问题不值得这么多努力)。