6

我有一个不想在任务栏中显示的应用程序。当应用程序最小化时,它会最小化到 SysTray。

问题是,当我将ShowInTaskbar = false最小化的应用程序显示在任务栏上方时,就在 Windows 7 开始按钮的上方。如果我ShowInTaskbar = true正确设置应用程序最小化,但显然应用程序显示在任务栏中。

知道为什么会发生这种情况以及如何解决吗?

未能最小化

编辑:为了清楚起见,这是我正在使用的代码:

private void Form1_Resize(object sender, EventArgs e)
        {
            if (WindowState == FormWindowState.Minimized) {                                                                                    
                this.Hide(); 
                this.Visible = false;         
                notifyIcon1.Visible = true;           
            }
            else
            {
                notifyIcon1.Visible = false; 
            }
        }

    private void btnDisable_Click(object sender, EventArgs e)
    {

        // Minimize to the tray
        notifyIcon1.Visible = true;
        WindowState = FormWindowState.Minimized; // Minimize the form
    }
4

5 回答 5

3

我的猜测是您还必须隐藏窗口。要在 WPF 中获得这种行为,我必须执行以下操作:

WindowState = WindowState.Minimized;
Visibility = Visibility.Hidden;
ShowInTaskbar = false;

由于 WPF 和 WinForms 最终都归结为 Win32 窗口,因此您可能必须做同样的事情。

于 2013-07-16T16:21:22.090 回答
3

没有事件处理程序可以确定何时触发了表单的最小化请求。因此,要在表单最小化之前“进入”,您必须连接到 WndProc 过程

private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MINIMIZE = 0xF020; 

[SecurityPermission(SecurityAction.LinkDemand, 
                    Flags = SecurityPermissionFlag.UnmanagedCode)]
protected override void WndProc(ref Message m)
{
    switch(m.Msg)
    {
        case WM_SYSCOMMAND:
            int command = m.WParam.ToInt32() & 0xfff0;
            if (command == SC_MINIMIZE && this.minimizeToTray)
            {
                PerformYourOwnOperation();  // For example
            }
            break;
    }
    base.WndProc(ref m);
}

然后您可以仅在PerformYourOwnOperation();方法中隐藏表单

public void PerformYourOwnOperation()
{
    Form form = GetActiveForm();
    form.Hide();
}

然后,您将需要一些Show()隐藏表单的机制,否则它将丢失。

另一种方法是使用表单的调整大小事件。但是,这会在表单最小化触发。为此,您可以执行以下操作

private void Form_Resize(object sender, EventArgs e)
{
    if (WindowState == FormWindowState.Minimized)
    {
        // Do some stuff.
    }
}

我希望这有帮助。

于 2013-07-16T16:23:33.833 回答
1

您可以使用NotifyIcon让程序显示在系统托盘中,并观察窗口的调整大小事件以将可见性切换为隐藏。

以下是如何监视窗口的调整大小事件。

如何检测窗口窗体何时被最小化?

下面是 CodeProject 提供的 NotifyIcon 使用教程。NotifyIcon 是一个 Windows 窗体元素,因此它仍然可以在您的应用程序中使用。

http://www.codeproject.com/Articles/36468/WPF-NotifyIcon

于 2013-07-16T16:28:52.097 回答
0

Here is one of the simplest solutions (I think so):

//Deactivate event handler for your form.
private void Form1_Deactivate(object sender, EventArgs e)
{
   if (WindowState == FormWindowState.Minimized) Hide();
}
于 2013-07-16T16:32:02.433 回答
0

添加处理程序以调整大小:

private void Form1_Resize(object sender, EventArgs e)
{
    Visible = WindowState != FormWindowState.Minimized;
}
于 2014-06-06T14:00:16.870 回答