有什么办法在C#中创建一个隐藏的主窗口?

21 c# winforms

我只想要一个带有隐藏主窗口的ac#应用程序,它将处理并响应窗口消息.

我可以创建一个表单而不显示它,然后可以调用Application.Run()而不传入表单,但是如何将创建的表单挂钩到消息循环中?

还有另一种方法可以解决这个问题吗?

提前感谢任何提示!

小智 19

优秀!那个链接指向了我正确的方向.这似乎有效:

        Form f = new Form1();
        f.FormBorderStyle = FormBorderStyle.FixedToolWindow;
        f.ShowInTaskbar = false;
        f.StartPosition = FormStartPosition.Manual;
        f.Location = new System.Drawing.Point(-2000, -2000);
        f.Size = new System.Drawing.Size(1, 1);
        Application.Run(f);
Run Code Online (Sandbox Code Playgroud)

为了防止它显示在Alt-Tab中,您需要它作为工具窗口.不幸的是,这可以防止它最小化.但是将起始位置设置为手动并将其定位在屏幕外就可以了!

  • 请记住,-2000,-2000非常接近某些多显示器设置的可见区域.你可能想要比这更进一步...... (6认同)
  • 或者甚至可以使用Screen类中的值来确定绝对不在屏幕上的点. (3认同)

小智 17

在重写VC++ TaskTray应用程序的过程中,在C#.NET中,我发现以下方法真正可行以实现以下目的.

  1. 启动时没有初始形式
  2. 运行Message Loop,可以根据需要与Invoke/BeginInvoke一起使用,因为IsWindowHandle为true

我遵循的步骤:

  1. 在Application.Run()中使用ApplicationContext而不是表单.有关我使用的示例,请参阅http://www.codeproject.com/Articles/18683/Creating-a-Tasktray-Application.
  2. 在GUI Designer 中将Form的ShowInTaskbar属性设置为true.(这似乎适得其反,但它有效)
  3. 将Form Class设置VisibleShowInTaskbar中OnLoad()方法重写为false,如下所示.
protected override void OnLoad(EventArgs e)
    {
        Visible = false; 
        ShowInTaskbar = false; 
        base.OnLoad(e);
    }
Run Code Online (Sandbox Code Playgroud)


Mar*_* B. 13

我知道这是一个老问题,但它在谷歌排名很好,所以无论如何我都会提供我的解决方案.

我做了两件事:

private void Form_Load(object sender, EventArgs e)
{
    Opacity = 0;
}

private void Form_Shown(object sender, EventArgs e)
{
    Visible = false;
    Opacity = 100;
}
Run Code Online (Sandbox Code Playgroud)


Tar*_*ion 8

最好的方法是在构造函数中使用以下1-2行:

this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false; // This is optional
Run Code Online (Sandbox Code Playgroud)

您甚至可以在VS Property窗口中设置Minimized属性.


Zac*_*son 5

您可以创建一个继承自的类System.Windows.Forms.NativeWindow(提供基本的消息循环功能),并Handle在其构造函数中引用该属性以创建其句柄并将其挂钩到消息循环中.一旦拨打电话Application.Run,您就可以处理来自它的消息.


小智 5

我解决了这样的问题:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Main main = new Main();
    Application.Run();
    //Application.Run(new Main());
}
Run Code Online (Sandbox Code Playgroud)

此代码位于 Program.cs 文件中,您可以看到注释掉的原始 Application.Run 方法调用。我只是创建一个 Main 类对象(我的主窗体类名为 Main)并启动不带任何参数的应用程序消息循环。这将启动应用程序,初始化任何表单组件但不显示表单。

注意:你必须有一些方法来显示你的窗口(比如系统托盘图标、热键或计时器或任何你可能喜欢的东西)。