我的应用程序有一个选项供用户仅在系统托盘中运行,而不是在任务栏中运行。当我的应用程序由 Delphi 6 构建时,这工作正常。切换到 Delphi XE2 后,它不再起作用。
我已经搞砸了一些,我在 Windows 7 上运行它,但是在 Windows XP 上运行时我仍然遇到问题。该应用程序正确地从任务栏中隐藏,并显示在系统托盘中。但是当我创建并显示任何其他表单时,该图标会显示在 Windows XP 中。
procedure TfrmAppointment.HideWindowFromTaskbar;
var
TaskbarList: ITaskbarList;
begin
Application.MainFormOnTaskBar := False;
// Windows 7 seems to behave differently. This seems to fix it.
if (CheckWin32Version(6, 1)) then
begin
// We are in Win7, and we requested the tray.
TaskbarList := CreateComObject(CLSID_TaskbarList) as ITaskbarList;
TaskbarList.HrInit;
TaskbarList.DeleteTab(Application.Handle);
end
else
begin
// Previous code from D6 days
ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
ShowWindow(Application.Handle, SW_SHOWNOACTIVATE);
end;
end;
如果用户选择在系统托盘中显示应用程序的选项,则运行该代码。它适用于我测试过的所有 Windows 版本。但是,在 Windows XP 上,当我显示任何子窗体时,应用程序会立即显示在任务栏中。在 Windows 7 中一切正常。
有什么我想念的想法吗?
我应该补充一点,我知道这可能与Hide the Main Form in a Delphi 2009 Application 的问题相同,但是我已经设置了 MainFormOnTaskBar,因此该答案似乎不适用。
[编辑:] 更具体地说,我在这里添加更多信息。该应用程序有两种模式:在任务栏中显示和在系统托盘中显示。
第一种模式与任何普通应用程序相同。该应用程序仅存在于任务栏中。它最小化到任务栏。它从任务栏恢复。
第二种模式的行为完全相同,但该任务栏图标仅存在于系统托盘中。因此,当用户最小化应用程序时,我截取该消息,获取“Shell_TrayWnd”/“TrayNotifyWnd”的 TRect,并调用 DrawAnimatedRects() 来模拟托盘的最小化。然后我隐藏主窗体。在来自系统托盘的消息中,我反向绘制相同的动画矩形,并使其再次可见。虽然表单可见,但它不会显示在任务栏中。
这在所有 Windows 版本中都可以正常工作。
我遇到的具体问题是,当显示任何其他表单时,Windows XP 正在任务栏中创建应用程序图标。Windows 7 不这样做。因此,如果 Windows XP 用户只使用应用程序主窗体,则不会出现问题,两种查看模式都可以正常工作。如果他们打开另一个窗口,则应用程序图标会出现,并且即使在该窗口关闭后也会保留在那里。Windows 7 不这样做,并且图标保持消失。