如何在后台显示表单的任务栏图标?

问题描述 投票:0回答:1

我使用此解决方案创建了不可见的表单:

protected override void SetVisibleCore(bool value)
{
    if (!IsHandleCreated)
    {
        CreateHandle();

        value = false;
        ShowOnTaskbar = false;
    }

    base.SetVisibleCore(value);
}

稍后,我通过调用以下代码使表单可见:

myForm.Show();
myForm.ShowOnTaskbar = true;

任务栏图标不会立即显示。当我点击表单使其处于活动状态后,它将显示。

如何显示非活动表单的任务栏图标?

c# .net winforms taskbar
1个回答
0
投票

正如其他人在评论中所说,您的问题在您提出时无法重现。这里是一个使用一种表单的简单演示,展示了任务栏图标如何无延迟地显示开/关。您可以尝试一下并告诉我它是否适合您吗?

首先,在表单不可见期间有一个从 5 秒到 0 秒的倒计时。之后,表单显示并开始每秒打开/关闭任务栏图标的可见性。

这是唯一表格的代码:

public partial class Form1 : Form
{
   delegate void ShowFormCallback();
   delegate void ToggleTaskbarIconVisibilityCallBack();

   public Form1()
   {
       InitializeComponent();

       Countdown();
   }

   protected override void SetVisibleCore(bool value)
   {
       if (!IsHandleCreated)
       {
           CreateHandle();

           value = false;
           ShowInTaskbar = false;
       }

       base.SetVisibleCore(value);
   }

   public void Countdown()
   {
       new Thread(() =>
       {
           Thread.CurrentThread.IsBackground = true;

           Console.WriteLine("Start countdown...");

           for(int i = 5; i> 0; i--)
           {
               Console.WriteLine($"{i}");
               Thread.Sleep(1000);
           }

           Console.WriteLine("Show Form and Taskbar icon!");

           ShowForm();
           StartTaskbarIconVisibilityToggle();

       }).Start();
   }

   public void StartTaskbarIconVisibilityToggle()
   {
       new Thread(() =>
       {
           Thread.CurrentThread.IsBackground = true;

           Console.WriteLine("Toggling taskbar icon visibility...");

           for (int i = 5; i > 0; i--)
           {
               Console.WriteLine("Toggle On/Off!");
               ToggleTaskbarIconVisibility();
               
               Thread.Sleep(1000);
           }

           Console.WriteLine("End of the demo!");

           ToggleTaskbarIconVisibility();

       }).Start();
   }

   private void ShowForm()
   {
       if (this.InvokeRequired)
       {
           ShowFormCallback callback = new ShowFormCallback(ShowForm);

           this.BeginInvoke(callback, new object[] { });
       }

       else
       {
           this.Show();
           this.ShowInTaskbar = true;
       }
   }


   private void ToggleTaskbarIconVisibility()
   {
       if (this.InvokeRequired)
       {
           ToggleTaskbarIconVisibilityCallBack callback = new ToggleTaskbarIconVisibilityCallBack(ToggleTaskbarIconVisibility);

           this.BeginInvoke(callback, new object[] { });
       }

       else
       {
           this.ShowInTaskbar = !this.ShowInTaskbar;
       }
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.