如何用C#初始隐藏主GUI窗口

时间:2013-05-29 22:34:42

标签: c# .net user-interface

我有一个用C#编写的GUI应用程序,它必须在启动时隐藏在屏幕外(相反,它会显示一个托盘图标。)在C ++ / MFC中我会隐藏它:

void OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
    CDialog::OnWindowPosChanging(lpwndpos);

    //Prevent dialog from showing
    lpwndpos->flags &= ~SWP_SHOWWINDOW;
}

但在C#中有更简单的方法吗?

4 个答案:

答案 0 :(得分:4)

您需要将表单的VisibleShowInTaskbar属性设置为 false ,然后只需使用NotifyIcon类在托盘区域中显示一个图标

如果这是您的应用程序打开的第一个表单,则需要修改Application.Run()文件中的Program.cs

简单地替换

Application.Run(new MyForm());

MyForm myForm = new MyForm();
Application.Run();

然后在表单的构造函数中初始化NotifyIcon对象。

NotifyIcon nIcon = new NotifyIcon();
nIcon.Icon = new Icon(@"...");
nIcon.Visible = true;

答案 1 :(得分:1)

您可以使用启动表单的ShowInTaskBar和Visible属性。

答案 2 :(得分:1)

您可以通过覆盖表单中的SetVisibleCore()方法在Winforms中执行此操作。需要一些额外的工作,本机窗口以传统的.NET懒惰方式创建。触发器是第一个Show()调用。所以你仍然需要确保这一点得到妥善处理。将此代码粘贴到表单中:

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

现在,您可以通过调用Show()或将Visible属性设置为true来使其可见。请注意,Load事件在此之前不会触发,因此请务必将所有初始化代码移动到它所属的构造函数中。

答案 3 :(得分:0)

我用它来隐藏控制台窗口,(最终)。

private static class NativeMethods
{
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    public static void SetConsoleWindowVisibility(Boolean argShow)
    {
        IntPtr hWnd = NativeMethods.FindWindow(null, Console.Title);

        if (hWnd != IntPtr.Zero)
        {
            if (!argShow)
                //Hide the window                    
                ShowWindow(hWnd, 0); // 0 = SW_HIDE                
            else
                //Show window again                    
                ShowWindow(hWnd, 1); //1 = SW_SHOWNORMAL           
        }
    }
}

所有看起来有点复杂,但它基本上是获得窗口的句柄,然后用它调用ShowWindow。由于它是一个控制台应用程序,我传入一个命令行参数,不隐藏窗口,进行调试等。

我把它放在program.cs中,解码命令行args,然后调用NativeMethods.SetConsoleWindowVisiblity。

从来没有找到为什么只是设置可见性和showintaskbar不起作用。但他们肯定没有