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

为什么Delphi 2006应用程序的任务栏按钮上下文菜单不完整?,delphi,vcl,taskbar,Delphi,Vcl,Taskbar,当我在Delphi 2006中创建一个新的VCL应用程序并运行它时(不添加任何我自己的代码或引用任何我自己的单元),该应用程序将不会在其任务栏按钮的上下文菜单中包含预期的所有菜单项。但是,应用程序的系统菜单(左键单击表单图标时得到的菜单)包含所有常规菜单项。正如您在下面的屏幕截图中所看到的,Move(Verschieben)、Size(Gröeäenden)和maximizeren)在前者中缺失 我无法在Delphi XE(我唯一可以访问的Delphi的其他版本)中复制这种行为,我也没有发现任

当我在Delphi 2006中创建一个新的VCL应用程序并运行它时(不添加任何我自己的代码或引用任何我自己的单元),该应用程序将不会在其任务栏按钮的上下文菜单中包含预期的所有菜单项。但是,应用程序的系统菜单(左键单击表单图标时得到的菜单)包含所有常规菜单项。正如您在下面的屏幕截图中所看到的,
Move
Verschieben
)、
Size
Gröeäenden
)和
maximizeren
)在前者中缺失

我无法在Delphi XE(我唯一可以访问的Delphi的其他版本)中复制这种行为,我也没有发现任何其他人报告这种行为

我还查看了
TForm
TApplication
的属性,看是否有一个可以控制这些菜单,但没有找到

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

区别在于,D2007中引入的属性自动设置为True

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

Project.dpr:

uses
  Windows,
  ...

  Application.CreateForm(TMainForm, MainForm);
  ShowWindow(Application.Handle, SW_HIDE);
  Application.Run;
  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;
FMain.pas:

uses
  Windows,
  ...

  Application.CreateForm(TMainForm, MainForm);
  ShowWindow(Application.Handle, SW_HIDE);
  Application.Run;
  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
时有效。

在D2006中,任务栏按钮由
TApplication
窗口拥有。单击任务栏按钮显示
t应用程序
系统菜单,VCL会更改该菜单,以始终删除最大化、大小和移动菜单项。另一方面,单击
t表单时,将显示表单的系统菜单,VCL将根据表单的
BorderStyle
BorderIcon
属性对其进行更改。因此,您实际上是在为两个单独的窗口处理两个单独的菜单


在现代Delphi版本中,当新的
TApplication.ShowMainFormOnTaskbar
属性设置为
true
时,任务栏由
TForm
而不是
TApplication
所有,因此单击任务栏按钮将显示表单的系统菜单,而不是
TApplication
系统菜单。因此,在本例中,您实际上是在处理单个窗口的单个菜单。

如果应用程序最大化,我希望看到较小的菜单。是这样吗?这就是原因。@KeithMiller不,它不是最大化的。回到过去,这曾经是标准的“检查应用程序是否用delphi编写的第一种方法”。因为您在任务栏上看到的窗口是Delphi仅用于任务栏窗口的特殊窗口。