Активировать форму после клика по ссылке средней кнопкой мыши

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

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

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


person Anatolii Humennyi    schedule 03.07.2013    source источник
comment
См. stackoverflow.com/questions/878429/   -  person PiLHA    schedule 03.07.2013
comment
Я думаю, вы имели в виду .BringToFront() вместо .Activate()?   -  person Jordy Langen    schedule 03.07.2013
comment
@PiLHA В теме, которую вы предложили рассмотреть вообще, есть еще одна проблема, которая мне не нужна. И решения моей проблемы нет...   -  person Anatolii Humennyi    schedule 03.07.2013
comment
@JordyLangen При использовании BringToFront() вместо Activate() ничего не меняется. И проблема остается в силе   -  person Anatolii Humennyi    schedule 03.07.2013
comment
Комментарий PilHA актуален. Обратитесь к вызову SetForegroundWindow в упомянутом вопросе.   -  person RogerN    schedule 03.07.2013
comment
@RogerN, с SetForegroundWindow эта проблема все еще остается.   -  person Anatolii Humennyi    schedule 08.07.2013


Ответы (2)


Согласен... использование SetForegroundWindow() в Deactivate() работало в моей системе:

    [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);
    }
person Idle_Mind    schedule 03.07.2013
comment
Это не работает, на самом деле Activate() работает так же, как SetForegroundWindow() - person King King; 03.07.2013
comment
Оба работали в моей системе... не знаю, что тебе сказать. Я использую Win 8 Pro. - person Idle_Mind; 03.07.2013
comment
Я использую Windows 7, какой браузер по умолчанию в вашей системе? У меня Google Chrome, странно, что Process, возвращаемый Start(), равен нулю? - person King King; 03.07.2013
comment
Я также использую Google Chrome (версия 27.0.1453.116 m). Я знаю, что есть настройки ОС, которые предотвращают кражу фокуса другими приложениями. В этих случаях приложение будет мигать на панели задач вместо того, чтобы получать фокус. - person Idle_Mind; 03.07.2013
comment
Как долго страница загружается в вашей системе? Мое подключение к Интернету не настолько хорошее, что для полной загрузки Google.com требуется около 4 секунд. - person King King; 03.07.2013
comment
У меня почти сразу всплывает. - person Idle_Mind; 03.07.2013
comment
Я автор этого вопроса, подтверждаю, что ваше решение не работает и на моем компьютере... Моя ОС Windows XP SP3. Мой браузер Опера. Страница Google с моим интернет-соединением загружается примерно за 1 секунду - person Anatolii Humennyi; 05.07.2013

Я не знаю, почему решение 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();
    }
}
person King King    schedule 03.07.2013
comment
Это не работает и на моем компьютере... Моя ОС Windows XP SP3. Мой браузер Опера - person Anatolii Humennyi; 05.07.2013
comment
@AnatoliiGumennyi, вы можете попробовать увеличить значение 500 до большего. Если даже это не сработает, я не могу понять, в чем проблема, потому что решение работает очень хорошо в моей системе (однако с Google Chrome). - person King King; 05.07.2013
comment
Я установил Google Chrome, и действительно с ним ваше решение прекрасно работает. Я также тестировал его на Mozilla Firefox. И там тоже все ок. Оказывается, это какая-то особенная опера открывает внешние ссылки. Я думаю, что она пытается не попасть в поле зрения... Я отредактировал свой вопрос. Я все еще хотел бы найти кросс-браузерное решение... - person Anatolii Humennyi; 08.07.2013