我有一个我不想在任务栏中显示的应用程序。当应用程序最小化时,它最小化为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
}
答案 0 :(得分:3)
我的猜测是你还必须隐藏窗口。要在WPF中获得此行为,我必须执行以下操作:
WindowState = WindowState.Minimized;
Visibility = Visibility.Hidden;
ShowInTaskbar = false;
由于WPF和WinForms最终都归结为Win32窗口,因此您可能需要做同样的事情。
答案 1 :(得分: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()
隐藏的形式,否则它将丢失。
另一种方法是使用表单的resize事件。但是,这会在表单最小化后触发。为此,您可以执行类似
的操作private void Form_Resize(object sender, EventArgs e)
{
if (WindowState == FormWindowState.Minimized)
{
// Do some stuff.
}
}
我希望这会有所帮助。
答案 2 :(得分:1)
您可以使用NotifyIcon让程序显示在系统托盘中,并观察窗口的调整大小事件以将可见性切换为隐藏。
以下是观察窗口调整大小事件的方法。
How to detect when a windows form is being minimized?
以下是使用CodeProject提供的NotifyIcon的教程。 NotifyIcon是一个Windows窗体元素,因此它仍然可以在您的应用程序中使用。
答案 3 :(得分:0)
这是最简单的解决方案之一(我想是这样):
//Deactivate event handler for your form.
private void Form1_Deactivate(object sender, EventArgs e)
{
if (WindowState == FormWindowState.Minimized) Hide();
}
答案 4 :(得分:0)
添加调整大小的处理程序:
private void Form1_Resize(object sender, EventArgs e)
{
Visible = WindowState != FormWindowState.Minimized;
}