为啥我的 Delphi 2006 应用程序的任务栏按钮上下文菜单不完整?

Posted

技术标签:

【中文标题】为啥我的 Delphi 2006 应用程序的任务栏按钮上下文菜单不完整?【英文标题】:Why is the taskbar button context menu of my Delphi 2006 application incomplete?为什么我的 Delphi 2006 应用程序的任务栏按钮上下文菜单不完整? 【发布时间】:2012-04-26 10:59:21 【问题描述】:

当我在 Delphi 2006 中创建一个新的 VCL 应用程序并运行它(不添加任何我自己的代码或引用我自己的任何单元)时,该应用程序不会在上下文菜单中包含所有预期的菜单项它的任务栏按钮。然而,应用程序的系统菜单(左键单击表单图标时获得的菜单)具有所有常规菜单项。如您在以下屏幕截图中所见,前者缺少Move (Verschieben)、Size(Größe ändern) 和Maximize(Maximieren)

我无法在 Delphi XE(我可以访问的唯一其他 Delphi 版本)中重现此行为,而且我也没有发现任何其他人报告此行为。

我也查看了TFormTApplication的属性,有没有可以控制这些菜单,但是没有找到。

我知道的所有应用程序在这两个菜单中都有相同的菜单项集,我也希望我的应用程序也这样做。如何让这两个菜单显示同一组项目?

【问题讨论】:

如果应用程序最大化,我希望看到较小的菜单。是这样吗? 这就是Application.MainFormOnTaskBar 所做的。 @KeithMiller 不,它没有最大化。 过去,这曾经是标准的“检查您的应用程序是否用 delphi 编写的第一种方法”。由于您在任务栏上看到的窗口是一个特殊的窗口,Delphi 仅将其用于任务栏窗口。 【参考方案1】:

区别在于Application.MainFormOnTaskBar,这是D2007中引入的属性,自动设置为True。

为了在早期版本中获得相同的效果,我总是使用以下方法:

Project.dpr:

uses
  Windows,
  ...

  Application.CreateForm(TMainForm, MainForm);
  ShowWindow(Application.Handle, SW_HIDE);
  Application.Run;

FMain.pas:

  TMainForm = class(TForm)
  private
    procedure WMSysCommand(var Message: TWMSysCommand);
      message WM_SYSCOMMAND;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  ...

procedure TMainForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
    ExStyle := ExStyle or WS_EX_APPWINDOW;
    WndParent := GetDesktopWindow;
  end;
end;

procedure TMainForm.WMSysCommand(var Message: TWMSysCommand);
begin
  if Message.CmdType = SC_MINIMIZE then
    ShowWindow(Handle, SW_MINIMIZE)
  else
    inherited;
end;

这仅在 MainForm.Visible 设置为 True 设计时间时有效。

【讨论】:

【参考方案2】:

在 D2006 中,任务栏按钮归TApplication 窗口所有。单击任务栏按钮将显示TApplication 系统菜单,该菜单被 VCL 更改为始终删除最大化、大小和移动菜单项。另一方面,当单击TForm 时,会显示Form 的系统菜单,它由VCL 根据Form 的BorderStyleBorderIcon 属性进行更改。因此,您实际上是在为两个单独的窗口处理两个单独的菜单。

在现代 Delphi 版本中,将新的 TApplication.ShowMainFormOnTaskbar 属性设置为 true,任务栏归 TForm 而不是 TApplication,因此单击任务栏按钮将显示窗体的系统菜单而不是TApplication 系统菜单。因此,在这种情况下,您实际上是在处理单个窗口的单个菜单。

【讨论】:

以上是关于为啥我的 Delphi 2006 应用程序的任务栏按钮上下文菜单不完整?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi程序在任务栏显示不了?

delphi程序如何从任务栏及时还原、显示窗体?

如何使Delphi做的程序不显示在任务栏中

Windows 7 的任务栏上的 Delphi 表单图标模糊(启用 MainFormOnTaskbar)

Delphi 新建窗口在任务栏不显示

delphi在窗口最小化时不在任务栏