6


0

一貫してフォームを前面に出すことはできません

いくつか試してみましたが、どれも機能しません…​

NotifyIconをクリックすると、すべてのWindowsの前に表示されるフォームがあります。 だからここに私が試したものがあります:

private void notifyIcon1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        this.TopMost = true;
        this.BringToFront();
        this.Focus();
        this.TopMost = false;
    }
}

次に、SetForegroundWindowを使用しようとしました。

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern bool SetForegroundWindow(IntPtr hwnd);

追加することにより

        SetForegroundWindow(this.Handle);

ifブロックの最後。

最後に、NotifyIconでマウスの右ボタンをクリックしてコンテキストメニューを開くとこれが機能しない場合、NotifyIconを左クリックすると前面に表示されることがわかりました。

私は最初にこのコードを追加しようとしました:

        cmsNotifyIcon.Show();
        cmsNotifyIcon.Close();

回避策として考えられるものとして、notifyIconコンテキストメニューを表示して閉じますが、役に立ちません。

これを行う方法、またはこれを回避する方法についてのアイデアはありますか?

5 Answer


5


MouseUpで実行するとどうなりますか?


3


これが私がやった方法です。 StartupWindowState`と HideWhenMinimized`は私のフォームのプライベートメンバーであることに注意してください。

private void OnOpenTrayMenuItemClicked(object sender, EventArgs e) {
    if (this.WindowState == FormWindowState.Minimized) {
        this.WindowState = this.StartupWindowState;
        this.ShowInTaskbar =
            (this.HideWhenMinimized && (this.WindowState == FormWindowState.Minimized)) ? false : true;
        this.Show();
    }

    this.Activate();
}


1


Show()の代わりに `Activate()`を使用します。 また、フォームが最小化されている場合、WindowStateをWindowState.Normal(または最小化する前の状態)に設定する必要があります。

        private void notifyIcon1_Click(object sender, EventArgs e)
        {
            Activate();

            // this is needed for minimized form to show
            WindowState = FormWindowState.Normal;
        }


0


同様の問題がありました。簡単な回避策で十分です。 フォームを表示する必要があるイベントハンドラーで、ウィンドウが表示されているかどうかを確認し、表示されている場合は最小化します。 その後、残りのコードはそれを元に戻します。

    private void OnDetails(object Sender, EventArgs Args)
    {
        if (DetailsForm == null)
        {
            DetailsForm = new MyForm(this);
        }

        if (DetailsForm.WindowState == FormWindowState.Normal)
            DetailsForm.WindowState = FormWindowState.Minimized;

        DetailsForm.WindowState = FormWindowState.Normal;
        DetailsForm.Show();
    }


0


これを試して

この機能は私のために機能します:

public static void BringFormToFront(Form form) {

    form.Activate();
    form.TopMost = true;
    form.TopMost = false;
    form.Focus();
    form.BringToFront();

}

そして、あなたが余分な怠zyになりたい場合:

public static void ShowFormToFront(Form form) {
    form.Show();
    BringFormToFront(form);
}

これらは簡単にhttp://csharp.net-tutorials.com/csharp-3.0/extension-methods/[extension methods]になります。