用鼠标中键点击链接后激活表格

时间:2013-07-03 13:05:11

标签: c# winforms linklabel

我想实现一个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和谷歌Chrome上他的解决方案(睡眠线程在500毫秒)和我的解决方案(上面的代码)工作正常,如果Firefox /谷歌Chrome没有运行或没有最小化。如果Firefox / Google Chrome最小化并单击表单上的LinkLabel,浏览器将展开,但之后表单未激活。

总结:不幸的是,尚未实现的跨浏览器解决方案......如果将Firefox和Google Chrome最小化,它们将无法运行。而Opera一般都会尽可能地抵制活动计划的拦截。

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

2 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分: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();
    }
}