【问题标题】:How to make a form visible by click in its windows tray icon如何通过单击其 Windows 托盘图标使窗体可见
【发布时间】:2014-11-01 19:07:33
【问题描述】:

在此页面的某处,我读到“覆盖”最小化方法的最佳方法是使用 onResize() 事件。 我已经做到了,而且有效!我已经编写了代码,当表单最小化时,它变得不可见,并在 Windows 托盘中放置了一个图标。到目前为止一切正常,但我也编程(或至少尝试过)当单击 Windows 托盘中的图标时,表单再次变为可见,但它不起作用,我不知道为什么。

我尝试对两个事件(Click 和 MouseClick)进行编码,但两者的代码相同,但仍然无法正常工作,所以我一定是做错了什么,但显然我不知道是什么。

请记住,我想要在 Windows 托盘图标上编写 click 事件,而不是在任务栏图标上,所以也许这就是它不起作用的原因,也许是另一个事件。

这是我的代码:

private void onResize(object sender, EventArgs e)
    {
        this.ShowInTaskbar = false;
        notifyIcon1.Visible = true;
        this.Visible = false;
    }

    private void notifyIcon_MouseClick(object sender, MouseEventArgs e)
    {
        this.ShowInTaskbar = true;
        this.Visible = true;
    }

    private void notifyIcon_Click(object sender, EventArgs e)
    {
        this.ShowInTaskbar = true;
        this.Visible = true;
    }

谢谢。

编辑:问题是我只是将图像分配给 Form 构造函数上的图标,如 notifyIcon1.Icon = new Icon("greenCircle.ico"); 但我没有在 notifyIcon 属性上初始化任何图像...通过在 notifyIcon 属性上初始化图像它工作正常!

【问题讨论】:

    标签: c# winforms icons notifyicon


    【解决方案1】:

    你可能不想在他们调整它的大小时隐藏它,只是在他们最小化表单时:

    private void onResize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Minimized)  // only hide if minimizing the form
        {
            this.ShowInTaskbar = false;
            notifyIcon1.Visible = true;
            this.Visible = false;
        }
    }
    

    要再次显示最小化的表单,您需要恢复它:

    private void notifyIcon_MouseClick(object sender, MouseEventArgs e)
    {
        this.ShowInTaskbar = true;
        this.Visible = true;
    
        WindowState = FormWindowState.Normal;
    }
    

    【讨论】:

    • 对,它再也不会回来了。我按照你说的“FormWindowState.Normal”做了。但是,以防万一,我放了“this.WindowState”,但没有任何变化。
    • 该死,我怎么没想到这样做……你肯定成功了。该事件实际上并未触发。现在关键是要知道为什么。正如我所说,这可能是另一个事件吗?
    • 不,我实际上看了很多遍,我又做了一遍,以防万一,但它被正确订阅了。 this.notifyIcon1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon_MouseClick);
    • 对,就是来自Designer.cs文件。顺便说一句,我发现this another thread可能是解决方案,但我根本不明白,这超出了我的知识范围。你怎么看? stackoverflow.com/questions/2595474/…
    • 哇哦。我终于找到了问题...我只是将图像分配给 Form 构造函数上的图标notifyIcon1.Icon = new Icon("greenCircle.ico"); 但我没有在 notifyIcon 属性上初始化任何图像...我真的不知道它有什么这样做,但关键是它有效!无论如何,您的帮助完成了我的代码,非常感谢! ;)
    【解决方案2】:
        this.ShowInTaskbar = true;
        this.Visible = true;
    

    这并没有达到您希望的效果。 Windows 中一个困扰许多程序员的棘手问题。 ShowInTaskbar 属性是“特殊的”,不太可能是大多数其他 Form 属性。它在底层 CreateWindowEx() winapi 函数中指定为样式位。还有其他类似的属性,例如 FormBorderStyle、ControlBox、LeftToRight。每个都对应一个样式位。

    问题是,更改属性需要 Winforms 执行相当大的操作,它会破坏本机窗口并重新创建它。这往往有副作用,你发现了一个。

    只需交换这两个语句,您会发现它的工作方式非常不同,现在它确实 设法使窗口再次可见。但还是不顺利,也不是总能走上前台。

    您可能会对看起来像一个巨大的错误感到困惑。真正的问题是,您正在做大多数其他程序员从未做过的事情,这始终是解决其他人没有的问题的好方法。您实际上根本不必更改 ShowInTaskbar 属性。隐藏窗口时任务栏按钮已经自动不可见,完全不需要帮助。

    删除程序中的所有 ShowInTaskbar 分配以解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多