如何在Windows 7中隐藏任务栏中的应用程序?

时间:2013-02-11 12:30:32

标签: delphi winapi delphi-2007 taskbar

我想隐藏Windows 7任务栏中的应用程序。

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

我尝试了以下帖子中的说明,但它对我的应用程序无效:

How to hide a taskbar entry but keep the window form

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

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

3 个答案:

答案 0 :(得分:9)

您可以覆盖主窗体的CreateParam以删除强制任务栏按钮(WS_EX_APPWINDOW)的标志,并另外通过应用程序窗口使表单拥有。那就是要求shell为窗口放置任务栏按钮的相反。来自“Managing Taskbar Buttons”:

  

[..]要确保窗口按钮放在任务栏上,请创建一个   具有 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属性的状态从其默认值“True”更改。

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


BTW,这是解决方案TLama posted的相同主题的文档引用:

  

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

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

答案 1 :(得分:8)

尝试使用this article中描述的棘手方式:

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

Project1.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.

Unit1.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.

答案 2 :(得分:0)

您的应用程序主窗体通常在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