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 émérite
    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
    Par défaut
    Code l'évènement onMouseDown, et teste les positions de X et de Y
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  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 : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    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...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre émérite
    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
    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.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    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 confirmé

    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 : 58
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    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 )
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  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