1

我想实现一个 LinkLabel,以便在通过鼠标中键单击它时在浏览器中打开链接,然后自动激活带有 LinkLabel 的表单。

为此编写了下面的代码。但它不起作用。在链接上单击鼠标中键后,链接打开,但表单未激活。为什么?以及如何解决?

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            this.linkLabel1.Text = "https://www.google.com.ua/";
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Middle)
            {
                if (!this.IsDisposed && !this.Disposing)
                {
                    this.Deactivate += new EventHandler(Form1_Deactivate);
                }
            }
            System.Diagnostics.Process.Start(this.linkLabel1.Text);
        }

        private void Form1_Deactivate(object sender, EventArgs e)
        {
            if (!this.IsDisposed && !this.Disposing)
            {
                this.Deactivate -= new EventHandler(Form1_Deactivate);
                this.Activate();
            }
        }
    }
}

编辑: 回答@King King 后发现这个问题只出现在浏览器Opera。在 Firefox 和 Google Chrome 上,如果 Firefox/Google Chrome 没有运行或没有最小化,他的解决方案(500 毫秒的睡眠线程)和我的解决方案(上面的代码)工作正常。如果 Firefox/Google Chrome 最小化并在我的表单上单击 LinkLabel,浏览器会展开,但之后表单不会被激活。

总结一下:不幸的是,跨浏览器的解决方案还没有实现…… Firefox 和谷歌浏览器如果被最小化就不起作用了。而 Opera 则大体上是尽其所能,拦截主动计划。

我知道这个问题的解决方案是存在的。例如,在我想要实现的 IM 客户端QIP中实现。在那里,单击链接窗口焦点后,将独立于浏览器恢复。

4

2 回答 2

0

我不知道为什么 Idle_Mind 的解决方案对我不起作用。但是,如果当前线程slept在调用它之后的一段时间内System.Diagnostics.Process.Start(this.linkLabel1.Text);将起作用。我对此进行了测试,您甚至不需要任何类型的订阅Deactivate事件:

private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Middle)
    {
        System.Diagnostics.Process.Start(this.linkLabel1.Text);
        System.Threading.Thread.Sleep(500);
        Activate();
    }
}
于 2013-07-03T15:48:42.237 回答
0

同意...在我的系统上使用 Deactivate() 中的 SetForegroundWindow() :

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Middle)
        {
            this.Deactivate += new EventHandler(Form1_Deactivate);
            System.Diagnostics.Process.Start(this.linkLabel1.Text);
        }
    }

    void Form1_Deactivate(object sender, EventArgs e)
    {
        this.Deactivate -= new EventHandler(Form1_Deactivate);
        SetForegroundWindow(this.Handle);
    }
于 2013-07-03T15:17:21.467 回答