2013-07-03 3 views
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 король, я обнаружил, что эта проблема возникает только в браузере Opera. В Firefox и Google Chrome его решение (со спящим потоком на 500 мс) и мое решение (какой код выше) отлично работают, если Firefox/Google Chrome не работает или не сведен к минимуму. Если Firefox/Google Chrome сведен к минимуму и нажмите ссылку LinkLabel в моей форме, браузер разворачивается, но после этого форма не активируется.

Подводя итог: к сожалению, кросс-браузерные решения еще не достигнуты ... Firefox и Google Chrome не работают, если они сведены к минимуму. И Opera в целом сопротивляется, как может, перехват активного плана.

Я знаю, что решение этой проблемы существует. Например, в IM-клиенте QIP реализовано, которое я хочу реализовать. И там, после нажатия на ссылку окна фокус восстанавливается независимо от браузера.

+1

См http://stackoverflow.com/questions/878429/activate-existing-browser-window-with-given-url- from-c-sharp-application-withou – PiLHA

+0

Я думаю, вы имели в виду '.BringToFront()' вместо '.Activate()'? –

+0

@PiLHA В теме, которую вы предложили, вообще рассматривается, это еще одна проблема, которая мне не нужна. И нет решения для моей проблемы ... –

ответ

0

Согласовано ... используя 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); 
    } 
+0

Это не работает, фактически 'Activate()' работает так же, как 'SetForegroundWindow()' –

+0

Оба работали в моей системе ... не знаю, что сказать ya. Я запускаю Win 8 Pro. –

+0

Я использую Windows 7, какой браузер по умолчанию в вашей системе? Mine - это Google Chrome, странно «процесс», возвращаемый 'Start()', равен нулю? –

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(); 
    } 
} 
+0

Это тоже не работает на моем компьютере ... Моя ОС Windows XP SP3.Мой браузер Opera –

+0

@AnatoliiGumennyi вы можете попробовать увеличить значение '500' до более высокого уровня, если даже это не сработает, я не могу понять, в чем проблема, потому что решение работает очень хорошо в моей системе (с помощью Google Chrome однако). –

+0

Я установил Google Chrome, и действительно с ним ваше решение работает отлично. Я также тестировал его на Mozilla Firefox. И там тоже все в порядке. Оказывается, это как-то особенная Opera открывает внешние ссылки. Я думаю, она пытается удержаться от фокуса ... Я отредактировал свой вопрос. Я бы хотел найти кросс-браузерное решение ... –