【问题标题】:How to hide an application from taskbar in Windows 7?如何在 Windows 7 的任务栏中隐藏应用程序?
【发布时间】:2013-01-26 13:01:16
【问题描述】:

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

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

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

How to hide a taskbar entry but keep the window form

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

是否发生了一些变化,这在 Windows 7 中是不可能的?或者你有什么 能想到,那会阻止它工作吗?

【问题讨论】:

标签: delphi winapi delphi-2007 taskbar


【解决方案1】:

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

【讨论】:

  • 你真的应该添加 SetWindowLong(Application.Handle, GWL_EXSTYLE, (GetWindowLong(Application.Handle, GWL_EXSTYLE) OR WS_EX_TOOLWINDOW) 而不是 WS_EX_APPWINDOW);在最后一个 Application.CreateForm 之后。
【解决方案2】:

您可以覆盖主窗体的 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 属性的状态从其默认的“真”更改。

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


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

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

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

【讨论】:

    【解决方案3】:

    尝试使用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.
    

    【讨论】:

    • 您可以在主表单代码中隐藏主表单,而不是隐藏主表单,您可以这样做Application.ShowMainForm := False;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2012-04-09
    • 1970-01-01
    • 2021-03-28
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多