我有一个用C#编写的GUI应用程序,它必须在启动时隐藏在屏幕外(相反,它会显示一个托盘图标。)在C ++ / MFC中我会隐藏它:
void OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
CDialog::OnWindowPosChanging(lpwndpos);
//Prevent dialog from showing
lpwndpos->flags &= ~SWP_SHOWWINDOW;
}
但在C#中有更简单的方法吗?
答案 0 :(得分:4)
您需要将表单的Visible和ShowInTaskbar属性设置为 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不起作用。但他们肯定没有