IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Comment intercepter le clic de la souris sur la barre de titre d'une TForm ?


Sujet :

Composants VCL Delphi

  1. #1
    tintin22
    Invité(e)
    Par défaut Comment intercepter le clic de la souris sur la barre de titre d'une TForm ?
    Salut, je voudrais intercepter le click de la souris sur la barre de titre de la fenetre de mon application.
    Comment faire?
    Merci.

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Code l'évènement onMouseDown, et teste les positions de X et de Y

  3. #3
    tintin22
    Invité(e)
    Par défaut
    L'evenement OnMouseDown ne se declanche pas sur la barre de titre !

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Normal, la barre de titre n'appartient pas réellement à ton application, mais à Windows... Pour le "comment le détecter", vaut mieux aller sur le forum "Développement Windows", mais ça risque d'être un peu chaud à interfacer en Delphi.

    Tu veux faire quoi exactement de cette détection de clic ? Il y a peut-être une autre (voire meilleure) solution que la détection des évènement souris...

  5. #5
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Citation Envoyé par ilyes
    L'evenement OnMouseDown ne se declanche pas sur la barre de titre !
    aïe
    zut
    Alors, il faut que tu fasses un HOOK souris.

  6. #6
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Il est possible de capter l'event souhaité.
    je propose ci-dessous un exemple de code qui le fait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        procedure FormActivate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        procedure SubClassWndProc(var Msg: TMessage);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    var H : HWND;
     
    procedure TForm1.SubClassWndProc(var Msg: TMessage);
     
    var L : LPARAM ;
       begin
      case  Msg.Msg of
     
          WM_CAPTURECHANGED:   begin
          // on passe ici meme si on click sur la barre du haut
                               H := HWND (L);    // handle of window to gain mouse capture
                              // ajouter ici les actions à mener
    //pour test par exemple
                               form1.caption := form1.caption + 'X';
                               end;
          end;
       WndProc(Msg);  // INDISPENSABLE de rebrancher sur wndproc
       end;
     
    procedure TForm1.FormActivate(Sender: TObject);
    begin
    WindowProc := SubClassWndProc;
    end;
     
    end.
    par rapport a l'impplementtation 'standard' on note

    1- l'ajout de procedure SubClassWndProc(var Msg: TMessage);
    dans la partie public de form1
    2- le "detournement" de winproc avec WindowProc := SubClassWndProc;
    dans l'activation de la form
    3- la capture des evenements WM_CAPTURECHANGED


    Ceci est détaillé dans MSDN.COM dans la rubrique developper.
    http://msdn.microsoft.com/developercenters/
    ce genre d'interception permet de capter quasiment tous ls messages window et les traiter " à la base" comme audio, communications, mouse, controls, ...

  7. #7
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Non, les événements sont aussi envoyés à la fenêtre, seulement les messages ne sont pas les même. Les codes sont en WM_NCxxxxx au lieu de WM_yyyyyy.

    Il existe alors une méthode simple pour les intercepter. Placez un composant TApplicationEvents sur la fiche et dans le OnMessage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
    begin
      If (Msg.message = WM_NCLBUTTONDOWN)And(Msg.hwnd=Handle)  then 
      Begin
        //...
      End;
    end;
    ( ce code est pour le bouton gauche )

  8. #8
    tintin22
    Invité(e)
    Par défaut
    Merci à vous.

Discussions similaires

  1. Souris sur la barre de titre
    Par Nico28 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/11/2008, 09h55
  2. Dessiner sur la barre de titre d'une autre application
    Par petitprince dans le forum Composants VCL
    Réponses: 2
    Dernier message: 16/10/2007, 17h29
  3. Réponses: 7
    Dernier message: 18/04/2007, 18h31
  4. Quatrième bouton sur la barre de titre d'une fenêtre
    Par Yacine95000 dans le forum MFC
    Réponses: 8
    Dernier message: 02/06/2004, 17h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo