3

我的应用程序 UI 上有一个链接,该链接使用System.Diagnostics.Process.Start(). 如果用户多次单击该链接,则会打开多个选项卡。

有没有办法,也许是一个命令行选项,仍然使用默认的网络浏览器,但如果 URL 已经打开,它只是重新打开同一个选项卡?如果它不能与所有可能的浏览器一起使用,那会很好,但如果它至少可以与 IE、Firefox 和 Chrome 一起使用,那就太好了。

我对此表示怀疑,但由于我没有看到关于这个主题的任何其他问题/答案,我想我会问。

4

1 回答 1

3

这在某种程度上是一种解决方法,但它可能会让您入门。我使用了 System.Diagnostics.Process.ProcessId。作为一个我使用 IE 的例子,我稍后会解释我为什么这样做。代码只是“又快又脏”,但我只是将其作为概念证明。

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

我添加了 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 用作文件名,它确实会在默认浏览器中打开网页,但它不会返回 processID。这就是为什么片段显示了 IE 的使用。(如果您要使用此选项,您可以使用 System.IO.File.Exists 来确保安装了所需的浏览器)
  • 如果您想使用此选项,您可以查询注册表以获取默认浏览器是什么,如果您有,您可以从注册表中获得的值启动它。如果您随后将 process.startinfo.filename 更改为此值,那么您将启动默认浏览器,但您仍将获得一个 processId,因此这可能是前进的方向。您可以在此处查看如何执行此操作:http: //social.msdn.microsoft.com/Forums/en/netfxbcl/thread/b200903e-ce69-4bd4-a436-3e20a7632dc4
  • 如果 Internet 窗口已经打开,则显示它,可以通过使用 SetForegroundWindow 属性来完成。由于这已在本文中记录,因此我没有在此代码段中添加它。

我希望这有助于您顺利上路。

于 2012-05-24T02:28:10.387 回答