1

C#でシステムトレイを最小化するための非常に典型的なハックソリューションがあります:

private void MainFormResize(object sender, EventArgs e) {
        if (FormWindowState.Minimized == this.WindowState) {
            this.Hide();
            systemTrayIcon.Visible = true;
        }
}

private void systemTrayIconMouseDoubleClick(object sender, MouseEventArgs e) {
    systemTrayIcon.Visible = false;
    this.Show();
    this.WindowState = FormWindowState.Normal;  
}

理想的には、システム トレイを最小化するとき、またはシステム トレイから再度開くときに、アプリケーションを非表示/再表示したいと考えています。システム トレイへの最小化は期待どおりに機能します。ウィンドウはすぐに消え、新しいトレイ アイコンが表示されます。

ただし、アイコンをダブルクリックすると、非常に奇妙な効果がいくつかあります。ウィンドウは、その位置に合わせてサイズ変更アニメーションが実行されます。ウィンドウは、画面の完全にランダムなコーナーから飛んでくるように見えます。

私はそれをしたくありません。私はただ欲しいだけMinimize > -Poof- DisappearDouble-click > -Poof- Appear、アニメーションや遅延、またはそのようなものは何もありません.

このコードにアニメーションがあるのはなぜですか? 他のコンテキストで呼び出すとForm.Show()、ウィンドウは自動的に希望どおりに表示されますが、NotifyIcon から呼び出すと、奇妙な動作をします。線かと思いましたがWindowState = FormWindowState.Normal、それを外すとウィンドウが前面に出てきません。

編集: この問題は、OS とテーマに依存しているようです。この問題は Windows XP には存在しないようですが、仮想マシンが少し遅いため、わかりにくいです。Windows 7 Aero では、任意のオフスクリーン位置の問題が発生します。Windows 7 Basic/Classic では、タスク バーに最小化され、タスク バーの以前の位置から再表示されます (システム トレイではなく、実際にタスク バーに最小化されたかのように)。Vista ではテストしていません。任意のヒント?

4

3 に答える 3

2

WindowState = FormWindowState.Normal 前に 並べ替えてみましたShow()か?表示されているアニメーションは、標準のウィンドウ復元アニメーションだと思います。Show()ウィンドウを復元する前に呼び出しているため、画面外の位置になります。

編集:私は今あなたの問題を見ています-私はそれを1秒ほど見て、試してみましたIMessageFilterが、何らかの理由で最小化時にWM_SYSCOMMANDをトラップできませんでした(復元時に起動しますが)。

あなたができる簡単なことの1つは、最小化Hide()アニメーションを使用することですが、サイズ変更ハンドラーで、呼び出しの直前WindowStateNormal. 最小化のアニメーションは表示されますが、最大化のアニメーションは表示されません (ほとんどのプラットフォームではあまり目立ちません)。

于 2010-11-22T22:43:05.773 に答える
0

プログラムの実行時にウィンドウを非表示にする必要がある場合は、ApplicationContext から派生し、NotifyIcon を表示するクラスを作成することをお勧めします。次に、Application.Run でフォームの代わりにこのクラスを使用します。

class TaskTray : ApplicationContext
{
    private NotifyIcon _Icon;
    public TaskTray()
    {
       _Icon = new NotifyIcon();
       //...
    )
}
static void Main()
{
    Application.Run(new TaskTray());
}
于 2010-11-23T00:18:16.137 に答える