15

我想从 Windows 7 任务栏中隐藏一个应用程序。

我想在屏幕边缘做一个工具栏之类的东西,当用户点击它时它会做某些事情,但我不希望它显示在任务栏中,因为它是我想留在后台的东西.

我尝试了以下帖子中的说明,但它不适用于我的应用程序:

如何隐藏任务栏条目但保留窗口形式

然后我在一个新的空 VCL 表单应用程序上尝试了它,它仍然无法正常工作。我搜索了其他解决方案,但它们的作用与链接帖子中的非常相似。

有什么改变,这使得在 Windows 7 中不可能吗?或者有什么你能想到的,可以阻止它工作?

4

3 回答 3

12

您可以覆盖主窗体CreateParam以删除强制任务栏按钮 ( WS_EX_APPWINDOW) 的标志,并另外使窗体应用程序窗口所有。这与 shell 为窗口放置任务栏按钮的要求相反。来自“管理任务栏按钮”:

[..] 为确保窗口按钮位于任务栏上,请使用WS_EX_APPWINDOW扩展样式创建一个无主窗口。[..]

样本:

type
  TForm1 = class(TForm)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle := Params.ExStyle and not WS_EX_APPWINDOW;
  Params.WndParent := Application.Handle;
end;

如果您使用此方法,请勿MainFormOnTaskbar将“应用程序”的属性状态从其默认“真”更改。

您还可以删除第二行 (..WndParent := ..) 并在对象检查器PopupMode中将表单设置为相同的效果。pmExplicit


顺便说一句,这是发布的解决方案TLama的同一主题的文档引用:

为了防止窗口按钮被放置在任务栏上,[...] 作为替代方案,您可以创建一个隐藏窗口,并使该隐藏窗口成为可见窗口的所有者。

当您设置MainFormOnTaskbar为 false 时,主窗体由 VCL 设计的应用程序窗口拥有。如果您隐藏应用程序窗口,则满足要求。

于 2013-02-14T17:54:09.187 回答
9

尝试使用以下描述的棘手方法this article

在项目文件中将设置MainFormOnTaskBar为 False。然后尝试从主窗体OnShowOnActivate事件处理程序中隐藏应用程序窗口。所以你的项目可能如下所示:

项目1.dpr:

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := False;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

单元1.pas:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);
end;

end.
于 2013-02-14T15:53:10.643 回答
2

您的应用程序主窗体通常在 dpr 中创建,因此打开 dpr 并查找创建主窗体的行。

// add this line first
// blank app title will prevent app from showing in the applications list in task manager
Application.Title := '';

// this line is already in the dpr and creates the main form, the class will differ
Application.CreateForm(TMainForm, Result);

// make the main form invisible to windows taskbar/task switcher
i := GetWindowLong(Application.Handle, GWL_EXSTYLE);
SetWindowLong(Application.Handle, GWL_EXSTYLE, i OR WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW);

我知道这适用于 XP 和 7。我猜它也适用于 8。这会添加工具窗口标志并删除 appwindow 标志,所以我想如果您对 toolwindow 标志不感兴趣,您可以省略以下部分

i OR WS_EX_TOOLWINDOW
于 2015-01-07T07:05:00.917 回答