StayOnBottom

L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013 - 13 juin 2008 à 16:13
L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013 - 16 juin 2008 à 08:37
         Mes cieux d'âmes...

   J'dois avouer.. j'suis pas fier de moi sur ce coup... J'ai voulu faire une petit appli' qui allait me prendre deux minutes à la concevoir... Pensais-naïvement... Oé naïvement...

   Depuis ce matin je suis sur un truc bête : Comment faire un genre de StayOnBottom ? Que la fiche de mon appli' soit "ancrée" au bureau ?

   J'ai essayé pas mal de choses : 

         - SetWindowLong(Application.Handle, HWND_BOTTOM,...);
         - D'intercepter le OnMinimize et de la restaurer
         - procedure TFrmPrincipale.CreateParams(var Params : TCreateParams); 
               begin
              inherited CreateParams(Params); //Don't ever forget to do this!!!
              Params.WndParent := GetDesktopWindow;
               end;
         - etc..

   Mais soit je les utilise mal, ou soit je procéde de la mauvaise maniére, parce que ma fiche se trouve bien derriére toutes les fenêtres, mais le soucis c'est que lorsque l'on clique sur l'icône "afficher le bureau", et bien là ca cache aussi mon appli'... J'ai vu dans mes recherche que windows ne faisait pas seulement que minimiser l'application lorsqu'on clique sur "Afficher le bureau", il déplace la fiche aussi... Je ne parviens pas à pallier à mon problème... 

   Si vous pouviez me mettre sur la piste je vous en serai très reconnaissant, surtout que ca semble tout bête

<hr />
L'Armand joue, l'arme en joug... Mon site

7 réponses

L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013
13 juin 2008 à 23:34
         Hum, merci Cirec de ta réponse, je connaissais ces procédures, je n'avais pas essayé dans ce programme alors c'est ce que j'ai fais, mais rien n'y fait, lorsqu'on clique sur "afficher le bureau" ma fiche est masquée :s j'ai pourtant fais un DeleteMenu de toutes les constantes pour être sûr lol
         Non mais je vois pas trop bien le paramétres que je puisse donner pour remédier à mon soucis :s

         Merci de ta réponse

<hr />
L'Armand joue, l'arme en joug... Mon site
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
14 juin 2008 à 14:19
Salut,

Un début de code. Testé sous Vista. Je créé une fenêtre avec le desktop en parente, et je lui applique le Ex style WS_EX_PALETTEWINDOW. J'ai mis aussi le FormStyle de la form sur fsStayOnTop.

La fenêtre résiste à Windows+D.
<hr />unit dfmStayOnBottom;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfrmMain = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  frmMain: TfrmMain;
  f2: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.Button1Click(Sender: TObject);
var
  nExStyle: Integer;
begin
  // Même fenêtre mais avec le bureau comme parente
  f2:= TfrmMain.CreateParented(GetDesktopWindow);

  // Mise en place du ExStyle WS_EX_PALETTEWINDOW
  nExStyle:= GetWindowLong(f2.Handle, GWL_EXSTYLE);
  nExStyle:= nExStyle or WS_EX_PALETTEWINDOW;
  SetWindowLong(f2.Handle, GWL_EXSTYLE, nExStyle);

  // On signale à windows qu'on a changé le ExStyle
  SetWindowpos(f2.Handle, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER or SWP_FRAMECHANGED);
  f2.Show;
end;

end.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
14 juin 2008 à 14:32
Avec une seule fenêtre :
<hr />unit dfmStayOnBottom;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfrmMain = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
var
  nExStyle: Integer;
begin
  ParentWindow:= GetDesktopWindow;

  FormStyle:= fsStayOnTop;

  // Mise en place du ExStyle WS_EX_PALETTEWINDOW
  nExStyle:= GetWindowLong(Handle, GWL_EXSTYLE);
  nExStyle:= nExStyle or WS_EX_PALETTEWINDOW;
  SetWindowLong(Handle, GWL_EXSTYLE, nExStyle);

  // On signale à windows qu'on a changé le ExStyle
  SetWindowpos(Handle, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER or SWP_FRAMECHANGED);
end;

end.
0
L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013
14 juin 2008 à 14:42
<ol>
<li>

      Bouge pas Rt15, j'm'essuie les cheveux et je test
</li>
</ol>



<hr />
L'Armand joue, l'arme en joug... Mon site
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013
14 juin 2008 à 14:55
            Merci Rt15, ca fonctionne dans le sens où ca ne disparait plus lorsque je clique sur "afficher le bureau" mais maintenant le soucis c'est que ca reste au dessus de toutes les fenêtres, hors je souhaiterais que ce reste en dessous de toutes les fenêtres lol, j'ai essayé en enlevant le fsStayOnTop et là ca reviens comme avant...

<hr />
L'Armand joue, l'arme en joug... Mon site
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
14 juin 2008 à 20:15
Arf.

Sous Windows, on peut faire des barre genre la barre des tâches, qui viennent se coller contre les bords d'écrans.

L'aide de la msdn au niveau de ces barres se trouve ici.

On peut télécharger un exemple poussiéreux, en C, ici.

Cependant, les Appbars ne résoudraient pas ton problème : topmost elles restent devant les autres fenêtres, et pas topmost, elles disparraissent lorsque l'on demande le bureau (J'ai fait l'éssai avec le C).

D'ailleurs sous Vista, si je clique droit sur la barre des tâches, propriété, et que je décoche "Conserver la barre des tâches au dessus des autre fenêtres" ->
Quand je demande le bureau (Windows + D ou le shortcut parfois présent dans la barre des tâches), la barre des tâches disparaît brievement avant de rapparaître.
Lors d'une deuxième tout de suite après la première,  la disparition est invisible.

J'en conclus que la barre des tâche rattrape plus le coup qu'autre chose lors que l'on demande le bureau et qu'elle n'est pas topmost.

Il faudrait essayer de faire pareil... La question c'est comment. Peut être avec un hook clavier, si le raccourci d'affichage du bureau génère un appui de touche.
0
L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013
16 juin 2008 à 08:37
         Bonjour Rt15, 

   Merci pour tes réponses, décidement tu m'octrois pas mal de temps entre ce poste ci, celui sur les utilisateurs connéctés, etc...

   Je m'étais fais cette refléxion, que j'allais être obligé de passé par la méthode d'intercepter la procédure de l'affichage du bureau, mais c'est quand même étrange qu'il n'y ai pas de fonction prévue pour le "StayOnBottom", pourquoi il y en a une pour le StayOnTop et pas Bottom ?

<hr />
L'Armand joue, l'arme en joug... Mon site
0
Rejoignez-nous