web-dev-qa-db-fra.com

Comment masquer une application de la barre des tâches dans Windows 7?

Je souhaite masquer une application de la barre des tâches Windows 7.

Je veux faire quelque chose comme une barre d'outils sur le bord de l'écran qui fait certaines choses lorsque l'utilisateur clique dessus, mais je ne veux pas que cela apparaisse dans la barre des tâches, car c'est une chose que je veux rester en arrière-plan .

J'ai essayé les instructions dans le post suivant, mais cela n'a pas fonctionné avec ma candidature:

Comment masquer une entrée de la barre des tâches tout en conservant le formulaire de fenêtre

Ensuite, je l'ai essayé sur une nouvelle application de formulaires VCL vide et cela ne fonctionnait toujours pas. J'ai cherché d'autres solutions, mais elles font toutes très bien la même chose que dans le post lié.

Quelque chose a changé, cela rend cela impossible dans Windows 7? Ou pouvez-vous penser à quelque chose qui pourrait l'empêcher de fonctionner?

13
Marks

Vous pouvez remplacer la variable CreateParam du formulaire principal pour supprimer l'indicateur qui force le bouton de la barre des tâches (WS_EX_APPWINDOW) et créer également le formulaire possédé par la fenêtre de l'application. Cela fait le opposé de l'obligation pour le shell de placer un bouton dans la barre des tâches d'une fenêtre. De " Gestion des boutons de la barre des tâches ": 

[..] Pour vous assurer que le bouton de la fenêtre est placé dans la barre des tâches, créez une fenêtre Non possédée avec le style WS_EX_APPWINDOW extended. [..]

Échantillon:

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;

Ne changez pas l'état de la propriété MainFormOnTaskbar de 'Application' à partir de sa valeur par défaut 'True' si vous utilisez cette méthode.

Vous pouvez également supprimer la deuxième ligne (..WndParent: = ..) et définir à la place PopupMode du formulaire sur pmExplicit dans l'inspecteur d'objets pour le même effet.


BTW, voici la citation de la documentation du même sujet pour la solution TLama posté :

Pour éviter que le bouton de la fenêtre ne soit placé dans la barre des tâches, [...] Vous pouvez également créer une fenêtre masquée et faire de cette fenêtre Cachée le propriétaire de votre fenêtre visible.

Lorsque vous définissez MainFormOnTaskbar sur false, le formulaire principal appartient à la fenêtre de l'application par la conception VCL. Et si vous masquez la fenêtre de l'application, l'exigence est remplie.

9
Sertac Akyuz

Essayez d’utiliser une méthode délicate décrite dans this article :

Définissez la variable MainFormOnTaskBar sur False dans votre fichier de projet. Essayez ensuite de masquer la fenêtre de l'application aux gestionnaires d'événement OnShow et OnActivate du formulaire principal. Donc, votre projet pourrait ressembler à ceci:

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.
6
TLama

votre formulaire principal d'application est normalement créé dans le fichier dpr. ouvrez-le et recherchez la ligne qui crée le formulaire principal.

// 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);

je sais que cela fonctionne sur XP et 7. J'imagine que c'est bien aussi pour 8. cela ajoute le drapeau de la fenêtre outil et supprime le drapeau appwindow donc je suppose que si vous n'êtes pas intéressé par le drapeau toolwindow, vous pouvez omettre la partie suivante

i OR WS_EX_TOOLWINDOW
0
Glenn