0

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

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

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

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

4

4 回答 4

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;
于 2013-05-29T22:41:36.857 回答
1

您可以使用启动窗体的ShowInTaskBar和 Visible 属性。

于 2013-05-29T22:35:28.620 回答
1

您可以在 Winforms 中通过覆盖表单中的 SetVisibleCore() 方法来执行此操作。需要一些额外的工作,本机窗口以传统的 .NET 惰性方式创建。触发器是第一个 Show() 调用。因此,您仍然必须确保解决此问题。将此代码粘贴到您的表单中:

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

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

于 2013-05-30T00:38:39.000 回答
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 中,解码命令行参数,然后调用 NativeMethods.SetConsoleWindowVisiblity。

从来没有发现为什么只是设置可见性和 showintaskbar 不起作用。但他们绝对没有

于 2013-05-29T23:02:26.080 回答