从NotifyIcon激活时,在form.Show()上阻止动画

时间:2010-11-22 22:37:53

标签: c# winforms notifyicon

我有一个非常典型的hackish解决方案,用于在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行,但是如果我删除它,窗口就不会被带到前台。

编辑:此问题似乎与操作系统和主题有关。 Windows XP中存在出现的问题,但很难分辨,因为我的虚拟机有点滞后。在Windows 7 Aero中,出现了abitrary-offscreen position问题。在Windows 7 Basic / Classic中,它最小化到任务栏,并从任务栏中的旧位置重新显示(就好像它实际上最小化到任务栏,而不是系统托盘)。我没有在Vista上测试过。有什么提示吗?

3 个答案:

答案 0 :(得分:2)

您是否尝试重新排序以将WindowState = FormWindowState.Normal 放在 Show()之前?我相信你看到的动画是标准的窗口还原动画。由于您在恢复窗口之前呼叫Show(),因此它会在屏幕外显示。

编辑:我现在看到你的问题了 - 我看了一会儿左右,甚至尝试了IMessageFilter,但由于某种原因,在最小化时无法捕获WM_SYSCOMMAND(虽然它恢复了火灾)。

您可以做的一件容易的事情就是使用最小化动画 - 在调整大小处理程序中,在Hide()调用之前,将WindowState设置为{{ 1}}。你会看到最小化动画,但不是最大化(在大多数平台上都不那么引人注目)。

答案 1 :(得分:0)

如果你需要在程序运行时隐藏窗口,最好的办法是创建一个派生自ApplicationContext并显示NotifyIcon的类。然后在Application.Run中使用此类而不是表单。

class TaskTray : ApplicationContext
{
    private NotifyIcon _Icon;
    public TaskTray()
    {
       _Icon = new NotifyIcon();
       //...
    )
}
static void Main()
{
    Application.Run(new TaskTray());
}

答案 2 :(得分:0)

至少可以让动画源自它应该的位置 - 您必须在托盘通知区域附近移动最小化窗口:see my hack here