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

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

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

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

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

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

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

3 ответа

Вы можете переопределить основную форму 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 свойство 'Application' из значения по умолчанию 'True', если вы используете этот метод.

Вы также можете удалить вторую строку (..WndParent:= ..) и вместо этого установить PopupMode формы для pmExplicit в инспекторе объектов на тот же эффект.


Кстати, вот цитата документации из той же темы для решения TLama опубликовано:

Чтобы кнопка окна не помещалась на панель задач, [...] в качестве альтернативы вы можете создать скрытое окно и сделать его скрытым владельцем видимого окна.

Когда вы установите MainFormOnTaskbar в false основная форма принадлежит окну приложения VCL design. А если скрыть окно приложения, требование выполнено.

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

Установить MainFormOnTaskBar Ложь в вашем файле проекта. Затем попытайтесь скрыть окно приложения от основной формы 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.

Основная форма вашего приложения обычно создается в 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, так что я думаю, что если вас не интересует флаг окна инструментов, вы можете пропустить следующую часть

i OR WS_EX_TOOLWINDOW
Другие вопросы по тегам