1

システムトレイにあるアプリケーションがあります。notifyIconまだ表示されていない場合は、ユーザーがクリックしたときに表示したいと思います。すでに表示されている場合は、非表示にする必要があります。また、ユーザーがフォーム以外の場所をクリックすると、フォームは非表示になります (表示されている場合)。

私のコードは次のようになります。

protected override void OnDeactivated(EventArgs e)
{
    showForm(false);
}

public void showForm(bool show)
{
    if(show)
    {
        Show();
        Activate();
        WindowState = FormWindowState.Normal;
    }
    else
    {
        Hide();
        WindowState = FormWindowState.Minimized;
    }
}

private void notifyIcon1_MouseClicked(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        if (WindowState != FormWindowState.Normal)
        {
            showForm(true);
        }
    }
}

コードの問題はonDeactivated、クリック呼び出しの前に呼び出され、フォームが非表示になり、notifyIcon1_MouseClicked再表示されることです。または他の場所をクリックしたためにフォーカスが失われたかどうかを検出できればnotifyIcon、問題は解決します。

私は調査を行い、同様のスレッドを見つけましたが、onDeactivated呼び出されたときにマウスの位置がトレイの上にあるかどうかを検出しただけの解決策です: NotifyIcon (タスクバー アイコン) をクリックしてウィンドウを切り替えます。

更新:投稿したソリューションは、ユーザーのマウスがタスクバーのトレイ アイコンの上にあるかどうかのみを検出するため、他のトレイをクリックしてもonDeactivatedイベントは発生しません。システム ボリューム アプリと同じ機能を取得したい。

4

1 に答える 1

5

ウィンドウが最後に非表示になった時刻を追跡するだけです。最近発生した場合は、マウスのクリックを無視します。このような:

int lastDeactivateTick;
bool lastDeactivateValid;

protected override void OnDeactivate(EventArgs e) {
    base.OnDeactivate(e);
    lastDeactivateTick = Environment.TickCount;
    lastDeactivateValid = true;
    this.Hide();
}

private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) {
    if (lastDeactivateValid && Environment.TickCount - lastDeactivateTick < 1000) return;
    this.Show();
    this.Activate();
}

アイコンを繰り返しクリックすると、ウィンドウの表示が確実に切り替わるようになりました。

于 2011-09-05T15:08:14.650 に答える