我想实现一个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中实现。在点击链接窗口后,焦点将独立于浏览器进行恢复。
答案 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();
}
}