1

我有一个非常典型的 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- Disappear并且Double-click > -Poof- Appear没有动画或延迟或任何类似的东西。

为什么这段代码有动画?如果我Form.Show()在任何其他上下文中调用,窗口会自动显示为我想要的,但是当从 NotifyIcon 调用时,它的行为很奇怪。我认为这可能是这WindowState = FormWindowState.Normal条线,但如果我删除它,窗口就不会被带到前台。

编辑:这个问题似乎与操作系统和主题有关。这个问题在 Windows XP 中似乎不存在,但很难说,因为我的虚拟机有点滞后。在 Windows 7 Aero 中,会出现任意离屏位置问题。在 Windows 7 Basic/Classic 中,它最小化到任务栏,并从其在任务栏中的旧位置重新出现(好像它实际上是最小化到任务栏,而不是系统托盘)。我还没有在 Vista 上测试过。有小费吗?

4

3 回答 3

2

您是否尝试WindowState = FormWindowState.Normal Show()重新订购?我相信您看到的动画是标准的窗口恢复动画。由于您是Show()在恢复窗口之前调用的,因此它会处于屏幕外位置。

编辑:我现在看到你的问题 - 我看了一秒钟左右,甚至尝试了一个IMessageFilter,但由于某种原因,在最小化时无法捕获 WM_SYSCOMMAND(尽管它会在恢复时触发)。

但是,您可以做的一件简单的事情是使用最小化动画 - 在您的调整大小处理程序中,就在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 回答
0

至少有可能让动画起源于它应该的位置 - 你必须将最小化的窗口移动到托盘通知区域附近:请参阅我的 hack here

于 2016-04-22T21:02:58.560 回答