如何开始的WinForm应用程序最小化到系统托盘?如何开始的WinForm应用程序最小化到系统托盘?

2019-05-08 16:45发布

我已经成功地创建了最大限度地减少使用的NotifyIcon托盘的应用程序。 当手动关闭的形式,它成功地从桌面,任务栏,使用Alt-Tab隐藏。 试图启动与最小化的应用程序时出现问题。 起初,问题是,应用程序将最小化,但仍然会出现在alt标签对话框。 更改FormBorderStyle到的工具窗口选项之一(从“无”选项)固定这一点,但是提出了另一个问题。 当第一次启动该应用程序最小化窗口的标题栏是可见的正上方开始菜单:

打开表单并关闭它会导致它正确地隐藏。 我试过很多的变化,但这里是它的本质上是如何工作的,现在...

的WindowState在设计设置为最小。 在构造函数中一些初始化之后,我有以下几行:

this.Visible = false;
this.ShowInTaskbar = false;

当NotifyIcon的是双击我有以下几点:

 this.WindowState = FormWindowState.Normal;
 this.Visible = true;
 this.ShowInTaskbar = true;

就像我说的,我已经试过这个(this.Hide()等),大量的微小变化的。 有没有办法有NotifyIcon的是主要成分,这样我可以完全启动和形式的处理,同时使NotifyIcon的运行? 一定有什么是开始没有任何古怪的最小化形式的应用程序的方式。 请帮我找到它!

Answer 1:

要做到这一点,正确的方法是防止形式在首位越来越明显。 这需要压倒一切SetVisibleCore()。 假设与一个显示和退出命令NotifyIcon的上下文菜单。 你可以这样实现:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        notifyIcon1.ContextMenuStrip = contextMenuStrip1;
        this.showToolStripMenuItem.Click += showToolStripMenuItem_Click;
        this.exitToolStripMenuItem.Click += exitToolStripMenuItem_Click;
    }

    private bool allowVisible;     // ContextMenu's Show command used
    private bool allowClose;       // ContextMenu's Exit command used

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

    protected override void OnFormClosing(FormClosingEventArgs e) {
        if (!allowClose) {
            this.Hide();
            e.Cancel = true;
        }
        base.OnFormClosing(e);
    }

    private void showToolStripMenuItem_Click(object sender, EventArgs e) {
        allowVisible = true;
        Show();
    }

    private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
        allowClose = true;
        Application.Exit();
    }
}

请注意,用Load事件皱纹,它不会火,直到第一个显示的主要形式。 所以一定要做好初始化形式的构造函数,而不是Load事件处理程序。



Answer 2:

构造函数中,删除这两条线:

this.Visible = false;
this.ShowInTaskbar = false;

和后添加InitializeComponent();

this.WindowState = FormWindowState.Minimized;

在设计中,设置ShowInTaskbarfalseFormWindowStateNormal

编辑:如果您发布相同的Load事件,窗口没有得到最小化,但仍显示最小化桌面上。 我认为这是一个错误。



Answer 3:

我读所有的答案,看看黑客和黑魔法......(没有进攻,队友)

伙计们,没有黑客需要。 你甚至没有必要设置“ShowInTaskbar =假”和其他的东西。 只是这样做:

    //"Form Shown" event handler
    private void Form_Shown(object sender, EventArgs e)
    {
        //to minimize window
        this.WindowState = FormWindowState.Minimized;

        //to hide from taskbar
        this.Hide();
    }

注:我强烈建议不接触“ShowInTaskbar”属性。 例如,如果您的应用程序注册的全系统热键或其他类似的东西(钩等) - 设置ShowInTaskBar = false,并最大限度地减少您的应用程序将阻止Windows发送一些信息到你的窗口...和你钩/热键/等均会停止工作。



Answer 4:

当最小化应用程序,你想从Alt + Tab键隐藏它:

您还需要设置不透明度为停止显示开始菜单附近的标题栏,当你设置的边框样式的工具窗口。

在最小化事件:

this.Visible = false;
this.Opacity = 0;
this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
this.ShowInTaskbar = false;

在规范化事件:

this.Visible = true;
this.Opacity = 100;
this.FormBorderStyle = FormBorderStyle.FixedSingle; //or whatever it was previously set to
this.ShowInTaskbar = true;


Answer 5:

这种“快速和肮脏的修复”为我工作:

$form1.FormBorderStyle = "fixedtoolwindow"
$form1.top = -1000000
$form1.Left = -1000000
$form1.Width = 10
$form1.Height = 10
$form1.WindowState = "normal"
$form1.ShowInTaskbar = $False
$form1.Opacity = 0
$form1.Hide()

希望它可以帮助别人...



文章来源: How to start WinForm app minimized to tray?