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

Mar*_*rks 13 delphi winapi taskbar delphi-2007

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

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

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

如何隐藏任务栏条目但保留窗口表单

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

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

Ser*_*yuz 9

您可以覆盖主窗体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;
Run Code Online (Sandbox Code Playgroud)

MainFormOnTaskbar如果使用此方法,请不要将"Application" 的属性状态从其默认值"True" 更改.

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


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

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

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


TLa*_*ama 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.
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)