Как скрыть приложение из панели задач в Windows 7?

Я хотел бы скрыть приложение из панели задач Windows 7.

Я хочу сделать что-то вроде панели инструментов на краю экрана, которая делает определенные вещи, когда пользователь нажимает на нее, но я не хочу, чтобы она отображалась на панели задач, поскольку это то, что я хочу остаться в фоновом режиме.

Я пробовал инструкции в следующем сообщении, но это не сработало в моем приложении:

Как скрыть запись в панели задач, но сохранить форму окна

Затем я попробовал его в новом пустом приложении VCL Forms и все еще не работал. Я искал другие решения, но все они делают то же самое, что и в связанном сообщении.

Что-то изменилось, что делает невозможным в Windows 7? Или есть что-нибудь, что ты может думать, что может помешать ему работать?

Ответ 1

Вы можете переопределить основную форму CreateParam, чтобы удалить флаг, который заставляет кнопку панели задач (WS_EX_APPWINDOW), а также сделать форму, принадлежащую окну приложения. Это противоречит требованию оболочки разместить кнопку панели задач для окна. От " Управление кнопками панели задач":

[..] Чтобы кнопка окна была помещена на панель задач, создайте незанятое окно с расширенным стилем 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. И если вы скрываете окно приложения, это требование выполняется.

Ответ 2

Попробуйте использовать сложный способ, описанный в this article:

Установите MainFormOnTaskBar в False в файле проекта. Затем попытайтесь скрыть окно приложения из основной формы OnShow и OnActivate обработчики событий. Таким образом, ваш проект может выглядеть следующим образом:

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.

Ответ 3

ваша основная форма приложения обычно создается в 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