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 と Google Chrome は、最小化されていると機能しません。そして、オペラは一般的に、アクティブな計画の傍受にできる限り抵抗します。

私は、この問題の解決策が存在することを知っています。たとえば、私が実装したいQIPが実装されたIMクライアントで。そこで、リンク ウィンドウをクリックすると、ブラウザとは関係なくフォーカスが復元されます。

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 に答える