启动默认的网络浏览器,但如果URL已经打开则不要启动

3
我在我的应用程序UI上有一个链接,使用System.Diagnostics.Process.Start()启动URL。如果用户多次点击该链接,它会打开多个选项卡。
是否有一种方式,可能是命令行选项,仍然使用默认的Web浏览器,但如果URL已经打开,则只重新打开同一选项卡?如果它不能与所有可能的浏览器一起使用,那么也可以,但最好至少能与IE、Firefox和Chrome一起使用。
我怀疑这不可能,但由于我没有看到关于这个主题的其他问题/答案,所以我想问一下。
1个回答

3
这是一种解决方法,但可能会让你开始。我使用了System.Diagnostics.Process.ProcessId。例如,我使用了IE,稍后我会解释为什么这样做。代码只是“快速而肮脏”,但我只是作为概念证明而编写的。
我创建了一个基本的WinForm应用程序,其中包含一个按钮,该按钮将在IE中打开Google,如果应用程序已经打开,则不会再次打开。
我添加了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;
    }

这并不能完全满足您的要求,但可能是一个不错的开始。我这样做的原因有几个,以及可能的选项。
  • 如果您将URL用作文件名,它确实会在默认浏览器中打开网页,但不会返回进程ID。这就是为什么代码片段显示使用IE的原因。(如果您使用此选项,则可以使用System.IO.File.Exists来确保所需的浏览器已安装)
  • 如果您想使用此选项,可以查询注册表以获取默认浏览器,如果您有该浏览器,则可以从注册表获取的值启动该浏览器。然后将process.startinfo.filename更改为此值,那么您将启动默认浏览器,但仍将获得进程ID,因此这可能是前进的方式。您可以在此处查看如何执行此操作:http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/b200903e-ce69-4bd4-a436-3e20a7632dc4
  • 如果Internet窗口已经打开,则可以使用SetForegroundWindow属性来显示它。由于这已经在this article中记录,因此我没有在此代码片段中添加它。

我希望这可以帮助你开始你的旅程。


好的解决方案,谢谢!由于IE为每个标签页(通常)使用一个新进程,因此这甚至可以跟踪您打开的标签页。当然,该标签页可能已经打开了其他网站,但是考虑到没有简单的答案,这是一个很好的答案。可能需要使用OLE/COM来进一步解决问题,但这不是我要寻找的(问题不值得那么多努力)。 - eselk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接