【问题标题】:Minimized application showing above the task bar任务栏上方显示的最小化应用程序
【发布时间】:2013-07-14 22:30:06
【问题描述】:

我有一个不想在任务栏中显示的应用程序。当应用程序最小化时,它会最小化到 SysTray。

问题是,当我设置ShowInTaskbar = false 时,最小化的应用程序在任务栏上方 显示,就在Windows 7 开始按钮的上方。如果我设置ShowInTaskbar = true,应用程序会正确最小化,但显然应用程序会显示在任务栏中。

知道为什么会发生这种情况以及如何解决吗?

编辑:为了清楚起见,这是我正在使用的代码:

private void Form1_Resize(object sender, EventArgs e)
        {
            if (WindowState == FormWindowState.Minimized) {                                                                                    
                this.Hide(); 
                this.Visible = false;         
                notifyIcon1.Visible = true;           
            }
            else
            {
                notifyIcon1.Visible = false; 
            }
        }

    private void btnDisable_Click(object sender, EventArgs e)
    {

        // Minimize to the tray
        notifyIcon1.Visible = true;
        WindowState = FormWindowState.Minimized; // Minimize the form
    }

【问题讨论】:

  • 好吧,这简直是天方夜谭,但我删除了 Form_Resize 事件,运行了应用程序,然后又添加了 resize 事件(使用相同的代码),现在它似乎可以工作了。

标签: c# winforms minimize


【解决方案1】:

当表单的最小化请求被触发时,没有事件处理程序来建立。所以要“进入”之前表单已经被最小化,你必须挂钩到 WndProc 过程

private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MINIMIZE = 0xF020; 

[SecurityPermission(SecurityAction.LinkDemand, 
                    Flags = SecurityPermissionFlag.UnmanagedCode)]
protected override void WndProc(ref Message m)
{
    switch(m.Msg)
    {
        case WM_SYSCOMMAND:
            int command = m.WParam.ToInt32() & 0xfff0;
            if (command == SC_MINIMIZE && this.minimizeToTray)
            {
                PerformYourOwnOperation();  // For example
            }
            break;
    }
    base.WndProc(ref m);
}

然后你可以只隐藏PerformYourOwnOperation();方法中的表单

public void PerformYourOwnOperation()
{
    Form form = GetActiveForm();
    form.Hide();
}

然后您将需要一些机制来Show() 隐藏表单,否则它将丢失。

另一种方法是使用表单的调整大小事件。但是,这会在表单最小化后触发。为此,您可以执行类似

的操作
private void Form_Resize(object sender, EventArgs e)
{
    if (WindowState == FormWindowState.Minimized)
    {
        // Do some stuff.
    }
}

我希望这会有所帮助。

【讨论】:

  • 谢谢Kc。我使用了 Form_Resize 事件。我必须剪切事件,运行应用程序,然后重新添加事件并且它可以工作。
  • 酷,很高兴我能帮上忙。 :]
【解决方案2】:

我的猜测是您还必须隐藏窗口。要在 WPF 中获得这种行为,我必须执行以下操作:

WindowState = WindowState.Minimized;
Visibility = Visibility.Hidden;
ShowInTaskbar = false;

由于 WPF 和 WinForms 最终都归结为 Win32 窗口,您可能必须做同样的事情。

【讨论】:

    【解决方案3】:

    您可以使用NotifyIcon 让程序显示在系统托盘中,并注意窗口的调整大小事件以将可见性切换为隐藏。

    这里是观察窗口大小调整事件的方法。

    How to detect when a windows form is being minimized?

    这里是 CodeProject 提供的 NotifyIcon 使用教程。 NotifyIcon 是一个 Windows 窗体元素,因此它仍然可以在您的应用程序中使用。

    http://www.codeproject.com/Articles/36468/WPF-NotifyIcon

    【讨论】:

      【解决方案4】:

      这是最简单的解决方案之一(我认为是这样):

      //Deactivate event handler for your form.
      private void Form1_Deactivate(object sender, EventArgs e)
      {
         if (WindowState == FormWindowState.Minimized) Hide();
      }
      

      【讨论】:

        【解决方案5】:

        添加调整大小的处理程序:

        private void Form1_Resize(object sender, EventArgs e)
        {
            Visible = WindowState != FormWindowState.Minimized;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-20
          • 1970-01-01
          • 2013-01-13
          • 1970-01-01
          相关资源
          最近更新 更多