如何制作没有界面的应用程序?

时间:2013-11-20 22:15:30

标签: c# winforms

我正在制作一个简单的CPU使用情况监视器。该应用程序只是任务栏中的一个图标,它使用Microsoft.WindowsAPICodePack库将任务的CPU使用率显示为图标进度条。

CPU Usage Icon

此应用程序目前正常运行。为了增加价值,我想阻止用户打开应用程序的表单,该表单是空白的。目前我正在使用以下代码:

/// <summary>
/// Forces this window to remain minimized.
/// </summary>
private void MainForm_SizeChanged(object sender, EventArgs e)
{
    if (WindowState != FormWindowState.Minimized)
        WindowState = FormWindowState.Minimized;
}

这会导致表单在屏幕上瞬间闪烁并缩小回任务栏。当点击图标时,我宁愿没有任何明显的事情发生。有没有办法实现这个目标?

尝试1

按照 deathismyfriend的建议,我试图隐藏表单。 WindowsAPICodePack抛出异常:

  

更新任务栏需要有效的活动窗口。

尝试2

设置this.Opacity = 0并不常用。有趣的是,表格是透明的...直到你最小化它。然后它出现并收缩到任务栏。

4 个答案:

答案 0 :(得分:3)

这对我有用。陷阱WM_SYSCOMMAND并禁止SC_RESTORE / SC_MAXIMIZE:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.Opacity = 0; // prevent ALT-TAB preview
        this.WindowState = FormWindowState.Minimized;
    }

    protected override void WndProc(ref Message m)
    {
        const int WM_SYSCOMMAND = 0x0112;
        const int SC_RESTORE = 0xF120;
        const int SC_MAXIMIZE = 0xF030;

        if ((m.Msg == WM_SYSCOMMAND) && ((int)m.WParam == SC_RESTORE || (int)m.WParam == SC_MAXIMIZE))
        {
            return;
        }

        base.WndProc(ref m);
    }
}

*将Opacity()设置为0(零)确实阻止了Alt-Tab预览窗口。

答案 1 :(得分:1)

您违反Windows界面标准才能执行此操作。这就是为什么它很难。系统托盘是为此类应用程序而构建的。您仍然可以在系统托盘中为图标设置动画以显示此类信息。这是另一个有助于系统托盘的问题:

How can I make a .NET Windows Forms application that only runs in the System Tray?

答案 2 :(得分:1)

仍然不优雅,但您可以将FormBorderStyle设置为FormBorderStyle.None,以防止在航空中的窗口预览上右键单击上下文菜单,然后将表单移出屏幕:

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        Location = new Point(int.MinValue, int.MinValue);
    }

答案 3 :(得分:0)

将不透明度设置为1并将窗口置于屏幕外位置。表单仍然会闪烁,但对用户来说是不可见的。