C# 如何使用C最初隐藏主GUI窗口#
我有一个用C#编写的GUI应用程序,它启动时必须隐藏在屏幕之外(相反,它会显示一个托盘图标)。在C++/MFC中,我会这样隐藏它:C# 如何使用C最初隐藏主GUI窗口#,c#,.net,user-interface,C#,.net,User Interface,我有一个用C#编写的GUI应用程序,它启动时必须隐藏在屏幕之外(相反,它会显示一个托盘图标)。在C++/MFC中,我会这样隐藏它: void OnWindowPosChanging(WINDOWPOS* lpwndpos) { CDialog::OnWindowPosChanging(lpwndpos); //Prevent dialog from showing lpwndpos->flags &= ~SWP_SHOWWINDOW; } 但是在C#?中
void OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
CDialog::OnWindowPosChanging(lpwndpos);
//Prevent dialog from showing
lpwndpos->flags &= ~SWP_SHOWWINDOW;
}
但是在C#?中有更简单的方法吗?您可以使用启动窗体的and Visible属性。您可以使用启动窗体的and Visible属性。您需要将窗体的and属性设置为false,然后只需使用该类在任务栏区域显示图标即可 或者,如果这是应用程序将打开的第一个表单,则需要在
程序.cs
文件中编辑应用程序.Run()
简单地替换
Application.Run(new MyForm());
与
然后在窗体的构造函数中初始化NotifyIcon对象
NotifyIcon nIcon = new NotifyIcon();
nIcon.Icon = new Icon(@"...");
nIcon.Visible = true;
您需要将表单的和属性设置为false,然后只需使用该类在托盘区域中显示一个图标 或者,如果这是应用程序将打开的第一个表单,则需要在
程序.cs
文件中编辑应用程序.Run()
简单地替换
Application.Run(new MyForm());
与
然后在窗体的构造函数中初始化NotifyIcon对象
NotifyIcon nIcon = new NotifyIcon();
nIcon.Icon = new Icon(@"...");
nIcon.Visible = true;
我用它来隐藏一个控制台窗口(最终) 所有这些看起来都有点复杂,但基本上是先得到一个窗口的句柄,然后用它调用ShowWindow。由于它是一个控制台应用程序,我传入一个命令行参数以不隐藏窗口,用于调试等 我把它放在program.cs中,解码命令行参数,然后调用NativeMethods.SetConsoleWindowVisiblity
从未发现仅仅设置可见性和showintaskbar不起作用的原因。但他们肯定没有我最终用它来隐藏控制台窗口 所有这些看起来都有点复杂,但基本上是先得到一个窗口的句柄,然后用它调用ShowWindow。由于它是一个控制台应用程序,我传入一个命令行参数以不隐藏窗口,用于调试等 我把它放在program.cs中,解码命令行参数,然后调用NativeMethods.SetConsoleWindowVisiblity
从未发现仅仅设置可见性和showintaskbar不起作用的原因。但是他们肯定没有在Winforms中,您可以通过覆盖表单中的SetVisibleCore()方法来实现这一点。需要做一些额外的工作,本机窗口是以传统的.NET惰性方式创建的。触发器是第一个Show()调用。所以你仍然必须确保这是照顾。将此代码粘贴到表单中:
protected override void SetVisibleCore(bool value) {
if (!this.IsHandleCreated) {
value = false;
this.CreateHandle();
}
base.SetVisibleCore(value);
}
现在,您可以通过调用Show()或将visible属性设置为true,使其在任何时候都可见。请注意,加载事件在此之前不会触发,因此请确保将所有初始化代码移动到它所属的构造函数中。在Winforms中,您可以通过覆盖表单中的SetVisibleCore()方法来执行此操作。需要做一些额外的工作,本机窗口是以传统的.NET惰性方式创建的。触发器是第一个Show()调用。所以你仍然必须确保这是照顾。将此代码粘贴到表单中:
protected override void SetVisibleCore(bool value) {
if (!this.IsHandleCreated) {
value = false;
this.CreateHandle();
}
base.SetVisibleCore(value);
}
现在,您可以通过调用Show()或将visible属性设置为true,使其在任何时候都可见。请注意,加载事件在此之前不会触发,因此请确保将所有初始化代码移动到它所属的构造函数中。如果单独使用,此属性所做的只是防止/允许您的窗口显示在任务栏中。用于对话框。但不是为了阻止主窗口显示…如果单独使用,此属性所做的只是阻止/允许您的窗口显示在任务栏中。用于对话框。但不是为了阻止主窗口显示…我这样做:
public Form1(){this.ShowInTaskbar=false;this.Visible=false;}
但是窗口仍然显示。请使用表单加载事件。如果要使用构造函数,请将不透明度设置为0(如果要显示表单,请将不透明度设置为100),而不是将Visible属性设置为false.OK。它是有效的。。。有点我的窗户在被移走之前会闪烁一毫秒左右。这不太好…是用可见光还是不透明法?由于事件在窗体加载时触发,因此可能会显示可见的。不透明方法不应导致窗口在开始时闪烁,因为它将在窗体构造函数中执行。我还编辑了我的答案,以便为您提供不同的解决方案,以防这将是应用程序运行的第一个窗体。我这样做:public Form1(){this.ShowInTaskbar=false;this.Visible=false;}
但窗口仍然显示。请使用表单加载事件。如果要使用构造函数,请将不透明度设置为0(如果要显示表单,请将不透明度设置为100),而不是将Visible属性设置为false.OK。它是有效的。。。有点我的窗户在被移走之前会闪烁一毫秒左右。这不太好…是用可见光还是不透明法?由于事件在窗体加载时触发,因此可能会显示可见的。不透明方法不应导致窗口在开始时闪烁,因为它将在窗体构造函数中执行。我还编辑了我的答案,以便为您提供不同的解决方案,以防这将是应用程序运行的第一个窗体。谢谢。我更喜欢这种方法。这正是我想要的。简单明了,谢谢。我更喜欢这种方法。这正是我想要的。简单明了。