如何在c#桌面应用程序中隐藏窗口?

时间:2010-12-29 17:49:10

标签: c# winforms windows-7 desktop-application

我正在尝试制作一个隐藏的桌面应用程序,但只会在一段时间后显示。我试图在窗口加载事件中设置Visible = false但它仍然显示。

6 个答案:

答案 0 :(得分:8)

Visforms属性在Winforms中是一个大问题,将其设置为true是导致创建本机Windows窗口的原因。其中一个副作用是在OnLoad方法或Load事件中将其设置为false不起作用。关于Hide()没什么特别的,它只是将Visible设置为false,因此也不起作用。

重写SetVisibleCore()是一种方法。然而,重要的是您仍然可以创建本机窗口。否则你不能关闭()表格。看起来像这样:

    protected override void SetVisibleCore(bool value) {
        if (!IsHandleCreated && value) {
            value = false;
            CreateHandle();
        }
        base.SetVisibleCore(value);
    }

您现在可以调用Show()或设置Visible = true以使窗口随时可见。并且即使您从未将其显示,也请调用Close()。这是使用仅通过上下文菜单显示的弹出窗口实现NotifyIcon的好方法。

请注意,这有副作用,OnLoad()方法和Load事件直到第一次实际可见时才会运行。您可能需要移动代码。

答案 1 :(得分:3)

你也可以试试这个..

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

    public Form1()
    {
        InitializeComponent();
        myHidingDelegate dlg = new myHidingDelegate(mymethodcall);
        dlg.BeginInvoke(null, null);
    }

 public void mymethodcall()
    {
        myHidingDelegate dlg1 = new myHidingDelegate(HideForm);
        this.Invoke(dlg1);
    }

     public void HideForm()
    { this.Hide(); }
}

唯一的问题是:表格闪烁片刻并消失

答案 2 :(得分:2)

对于WinForms应用程序,我发现控制启动可见性的最简单方法是覆盖SetVisbileCore方法。

这是一个简单的例子,表格将在5秒后显示

using System;
using System.Windows.Forms;

namespace DelayedShow
{
  public partial class Form1 : Form
  {
    private bool _canShow = false;
    private Timer _timer;

    public Form1()
    {
      InitializeComponent();
      _timer = new Timer();
      _timer.Interval = 5000;
      _timer.Tick += new EventHandler(timer_Tick);
      _timer.Enabled = true;
    }

    void timer_Tick(object sender, EventArgs e)
    {
      _canShow = true;
      Visible = true;
    }

    protected override void SetVisibleCore(bool value)
    {
      if (_canShow)
      {
        base.SetVisibleCore(value);
      }
      else
      {
        base.SetVisibleCore(false);
      }
    }
  }
}

答案 3 :(得分:1)

您是否尝试this.Hide()代替Visible = false

另一个选项可以是启动应用程序而不在其中传递任何表单对象。

Application.Run();

等待一段时间(使用Timer),然后打开表单。

答案 4 :(得分:0)

Main方法中,使用Application.Run()代替Application.Run(new Form1())。然后稍后使用new Form1()form1.Show()

答案 5 :(得分:0)

将C#应用程序放在系统托盘中

  1. 要开始使用,请打开现有的C#Windows窗体(或创建一个新窗体)。
  2. 打开Visual Studio工具箱。
  3. 将NotifyIcon控件拖到窗体上。控件将默认命名为notifyIcon1并放在表单下方,因为它在表单上没有可视化表示。
  4. 将NotifyIcon控件的Text属性设置为当用户将鼠标悬停在应用程序图标上时要显示的名称。例如,此值可能是“KillerApp 1.0”。
  5. 将控件的Icon属性设置为您希望在系统托盘中显示的图标。
  6.   

    提示:如果您有BMP文件   想要转换为图标文件,我   强烈推荐QTam Bitmap   图标3.5应用程序。

    - 为表单的Resize事件添加事件处理程序,该事件将在应用程序最小化时隐藏它。这样,它就不会出现在任务栏上。

    private void Form1_Resize(object sender, System.EventArgs e)
      {
         if (FormWindowState.Minimized == WindowState)
            Hide();
      }
    

    - 为NotifyIcon.DoubleClick事件添加事件处理程序,并按如下方式对其进行编码,以便在双击图标时恢复应用程序。

    private void notifyIcon1_DoubleClick(object sender,
                                           System.EventArgs e)
      {
          Show();
          WindowState = FormWindowState.Normal;
      }