我有一个非常典型的hackish解决方案,用于在C#中最小化系统托盘:
private void MainFormResize(object sender, EventArgs e) {
if (FormWindowState.Minimized == this.WindowState) {
this.Hide();
systemTrayIcon.Visible = true;
}
}
private void systemTrayIconMouseDoubleClick(object sender, MouseEventArgs e) {
systemTrayIcon.Visible = false;
this.Show();
this.WindowState = FormWindowState.Normal;
}
理想情况下,我希望我的应用程序在最小化或从系统托盘重新打开时消失/重新出现。最小化到系统托盘按预期工作 - 窗口消失,没有延迟,并出现一个新的托盘图标。
然而,双击图标会产生一些非常奇怪的效果。窗口将调整大小动画到其位置 - 窗口似乎从屏幕的一个完全随机的角落飞入。
我不希望这样。我只希望Minimize > -Poof- Disappear
和Double-click > -Poof- Appear
没有动画或延迟或任何类似的内容。
为什么这段代码有动画?如果我在任何其他上下文中调用Form.Show()
,窗口会自动显示,但是当从NotifyIcon调用时,它的行为很奇怪。我认为它可能是WindowState = FormWindowState.Normal
行,但是如果我删除它,窗口就不会被带到前台。
编辑:此问题似乎与操作系统和主题有关。 Windows XP中存在出现的问题,但很难分辨,因为我的虚拟机有点滞后。在Windows 7 Aero中,出现了abitrary-offscreen position问题。在Windows 7 Basic / Classic中,它最小化到任务栏,并从任务栏中的旧位置重新显示(就好像它实际上最小化到任务栏,而不是系统托盘)。我没有在Vista上测试过。有什么提示吗?
答案 0 :(得分:2)
您是否尝试重新排序以将WindowState = FormWindowState.Normal
放在 Show()
之前?我相信你看到的动画是标准的窗口还原动画。由于您在恢复窗口之前呼叫Show()
,因此它会在屏幕外显示。
编辑:我现在看到你的问题了 - 我看了一会儿左右,甚至尝试了IMessageFilter
,但由于某种原因,在最小化时无法捕获WM_SYSCOMMAND(虽然它恢复了火灾)。
您可以做的一件容易的事情就是使用最小化动画 - 在调整大小处理程序中,在Hide()
调用之前,将WindowState
设置为{{ 1}}。你会看到最小化动画,但不是最大化(在大多数平台上都不那么引人注目)。
答案 1 :(得分:0)
如果你需要在程序运行时隐藏窗口,最好的办法是创建一个派生自ApplicationContext并显示NotifyIcon的类。然后在Application.Run中使用此类而不是表单。
class TaskTray : ApplicationContext
{
private NotifyIcon _Icon;
public TaskTray()
{
_Icon = new NotifyIcon();
//...
)
}
static void Main()
{
Application.Run(new TaskTray());
}
答案 2 :(得分:0)
至少可以让动画源自它应该的位置 - 您必须在托盘通知区域附近移动最小化窗口:see my hack here