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

 Delphi Discussion :

Item PopupMenu handle


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut Item PopupMenu handle
    Bonjour à tous.

    J'agis sur une application externe, et là, j'ai besoin de récupérer les items, donc les textes qui se trouve dans un PopupMenu "externe à mon application".
    J'arrive à récuperer son handle à chaque clic par sa classe, donc, sachant son handle, comment puis-je procéder.
    Merci à vous.

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Tu peux faire ceci par exemple (fonctionne sous Delphi 2009) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Count: Integer;
      Buffer: array[0..MAX_PATH - 1] of Char;
    begin
    Count := Length(Buffer);
    GetWindowText(Button1.Handle, Buffer, 255);
    ShowMessage(Buffer);
    end;
    Tu remplaces Button1.Handle par l'Handle de ton item ...
    En espérant t'avoir aidé

    A+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    Bonjour ero-sennin

    Merci de t'interesser à mon problème.
    Cela ne fonctionne pas, même sous delphi 2009...
    J'ai même essayer de renvoyer le contenu dans un memo, mais c'est la même chose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Timer1Timer(Sender: TObject);
     Var monhandle, Count : Integer;
          Buffer: array[0..MAX_PATH - 1] of Char;
    begin
     monhandle:= FindWindow('#32768', Nil);
     label1.Caption:= IntToStr(monhandle); // pour vérifier que j'ai un handle.
     Count := Length(Buffer);
     GetWindowText(monhandle, Buffer, 255);
     Memo1.Lines.Add(Buffer);
    Voilà, le tous placé dans un Timer, étant donner que c'est du popup et que je ne peut pas cliquer sur un bouton et un popup en même temps.
    Peut-être est-ce dû à GetWindowText qui ne peut récupérer uniquement le contenue Texte d'une barre de titre mais qpas d'un popup ?
    Merci.
    je suis sûr que c'est presque ça

    J'ai même essayer ceci, mais en vain:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Timer1Timer(Sender: TObject);
     Var monhandle, longueur : Integer;
         texte: String;
    begin
     monhandle:= FindWindow('#32768', Nil);
     label1.Caption:= IntToStr(monhandle);
     
    longueur := SendMessage(monhandle, WM_GETTEXTLENGTH, 0, 0); // recupère dans variable longueur le contenue de longueur
      SetLength(texte, longueur);   // On demande de la place
      SendMessage(monhandle, WM_GETTEXT, longueur +1, LParam(PChar(texte))); // longueur + 1 pour 0#
     
      Memo1.Lines.Add(texte); // Ajoute le contenue de texte dans memo1
    Voilà, c'est la galère
    Autre chose ?
    merci

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut yannfrance,

    J'avais pourtant essayé avec un TButton ... et ce n'est pas une barre de titre
    Pour ce qui est de la seconde solution, c'est celle que j'aurai donné si éventuellement ça ne fonctionnerait pas

    Faudrait voir pour être sur que ton Handle est bien celui que tu penses être.
    Tu peux télécharger WindowSpy pour voir le Handle de ton TItems ...

    A+

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    Re ero-sennin

    Oui, le handle est le bon étant donné que je le tiens dans un Label et que je procède la vérification via windowsSpy.
    On parle bien d'agir sur une appli externe, car tu me dit un Titems, qui semble être du local.
    Ensuite, je précise que dans un popupMenu, Chaque items ne contient pas de handle, c'est le popup qui le contient, donc sachant ceci, même avec GetText, je ne doit normalement pas récuperer les items.
    Arf, je suis à bout de connaissance là ont dirais
    personne n'as déjà fait cette manip ?

    ero-sennin , merci beaucoup pour ton aide, c'est sympa

  6. #6
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Bon, j'avoue que c'est assez délicat comme soucis
    Je viens de faire quelques tests, et effectivement, je n'arrive à rien.
    Le handle du popup menu est celui lorsque l'on clic droit sur le bureau non ?
    Du moins, c'est celui ci que j'ai comme class ...

    Bon, ba là, je sèche aussi, désolé

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    Oui je sais, quand je pose une question sur les forums, c'est pour poser des complications
    Enfin bref, j'ai fouiller un peut l'aide de delphi, et j'ai trouver qu'il était possible de récuperer les textes des menus via : getMenuString
    Mais, peut-ont l'utiliser sur la class #32768 ?
    Il propose d'agir sur un handle, donc je pense que ça devrais le faire ?
    En effet, cette class est celle des popupenu que tu peut trouver en cliquant droit sur le bureau, mais tu la trouve aussi dans tes propres applications que tu developpe lorsque tu travaille les popupMenu, TMainMenu...
    Je vais continuer de chercher avant d'aller me reposer
    Et merci encore pour ton aide

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 450
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 450
    Points : 1 336
    Points
    1 336
    Par défaut
    Bonjour à toutes et à tous,

    @ Yannfrance, ce lien t'aidera peut être :

    http://vcallies.developpez.com/delphi/astuces/

    @+,

    Cincap

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    Bonjour cincap.

    Merci pour le lien, mais j'y suis déjà passer plus d'une fois.
    Ca fonctionne sur ma form, mais pas sur les aplli externe à mon application.
    Merci quand même

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 450
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 450
    Points : 1 336
    Points
    1 336
    Par défaut
    @ Yannfrance, tu pourrais peut être passer par un fichier *.ini en direct, sur l'application 1, tu récupères les paramètres du fichier ini (créé par l'appli 2) et sur l'application 2, tu sauvegardes en direct dans le fichier *.ini le click sur les items.

    Voir aussi la façon du drag and drop.

    @+,

    Cincap

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    Re cincap ,

    Oui, mais le soucis, c'est que l'application externe que je souhaite agir n'est pas Mon application(je ne l'ai pas coder) mais une application fait dans un autre langage et par un autre éditeur.
    Ou alors, j'ai rien compris

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    ça doit-être un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Timer1Timer(Sender: TObject);
     Var monhandle, hmenu, nmenuid : Integer;
    begin
     monhandle:= FindWindow('#32768', Nil);
     label1.Caption:= IntToStr(monhandle);
     
     hmenu:= GetMenu(monhandle);
     nmenuid := GetMenuItemID(hmenu, 15);
     SendMessage(monhandle, WM_LBUTTONDOWN , nmenuid, 0);
     SendMessage(monhandle, WM_LBUTTONUP , nmenuid, 0);
     
    end;
    Voilà, mais cela ne fonctionne evidemment pas, sinon, çe serais trop beau

    En faite, même si je n'arrive pas à récupérer le texte, je m'en fiche, mais au moins pouvoir agir sur ce popup, selectionner un items ou compter le nombres d'item bien que même ça, il me renvoie 0
    La seul chose que j'arrive à faire sur ce popup, c'est un WM_CLOSE, c'est bien la preuve que je récupère le bon handle, mais je ne sais pas interagir avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Timer1Timer(Sender: TObject);
     Var monhandle, hmenu,nmenuid : Integer;
    begin
        monhandle:= FindWindow('#32768', Nil);
        if monhandle <> 0 then
          Sendmessage(monhandle, WM_CLOSE, 0, 0);
    end;
    Amusant, bref, c'est pour voir que j'interagit sur le bon handle, celui des popupMenu...

  13. #13
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    J'ai regardé encore un peu de plus près ce que tu avais proposé et j'avoue que le sujet est intéressant!

    J'ai donc creusé un peu aussi de mon coté ... Je voulais savoir si le Handle qu'on récupérait était bien un handle de menu afin de lui appliquer diverses fonctions telles que GetMenuString, GetMenuItemCount, GetMenuItemID:

    Mais ce qu'il en ressort avec la fonction IsMenu, c'est que ce n'est pas un handle de menu

    Voici le code testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
     monHandle : HWND;
     SysMenu: hMenu;
    begin
      monHandle:= FindWindow('#32768', Nil);
      SysMenu:= GetMenu(monHandle);
     
      if(monhandle <> 0)then
        if(IsMenu(SysMenu))then
          Memo1.Lines.Add('OK')
        else
          Memo1.Lines.Add('NON');
    end;
    J'espère vraiment qu'on arrivera à nos fins,
    Cordialement,
    Ero

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    Salut ero-sennin

    J'ai regardé encore un peu de plus près ce que tu avais proposé et j'avoue que le sujet est intéressant!
    Travailler avec les handles, c'est toujours interressant à vrai dire, j'ai débuter par là.

    Mais ce qu'il en ressort avec la fonction IsMenu, c'est que ce n'est pas un handle de menu
    Je sais pas vraiment si je me trompe, mais la fonction IsMenu fonctionne d'àpres moi sur une de nos propre application, en local
    En plus, lors du test, le résultat de SysMenu est de 0...
    Je pense que pour agir sur les menus externe, il faut le faire via sendmessage
    Je connais des applications qui fait cela, mais je ne vois pas comment les auteurs ont réussi à faire cela.
    J'ai essayer d'éspionner le comportement de ces logiciels avec Spy++, mais c'est assez dur

    Je vais continuer de chercher du coté des api, si des developpeur ont réussi, ont peut réussir aussi
    je tiens au courant de mes avancés.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    Bon, j'ai enclencher la vitesse escargot, ce qu'il me permet d'avancer tres lentement, mais au moin, j'avance

    Regarde ça ero-sennin , ça va t'interresser et moi aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Var monhandle, hmenu,ncount : Integer;
    begin
     monhandle:= FindWindow(Nil, 'Sans titre - Bloc-notes');
     label1.Caption:= IntToStr(monhandle);
     hmenu := GetMenu(monhandle);
     ncount := GetMenuItemCount(hmenu);
     Label2.Caption:= inttostr(ncount);
    En faite, je crois que c'est inutile d'agir directement sur la classe #32768
    Il faut récuperer les menu via la fenêtre parente pour agir
    ca avance doucement, mais je vais y arriver

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 450
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 450
    Points : 1 336
    Points
    1 336
    Par défaut
    @ Yannfrance, essaye un peu ce code, il y a aussi des chôses intéressantes :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Menus, ExtCtrls;
     
      {$B-}
     
    type
      TfrSpeMenu = class(TForm)
        Label1: TLabel;
        gbFen: TGroupBox;
        butDelDef_fr: TButton;
        butDelPers_fr: TButton;
        butMkPers_fr: TButton;
        gbApplication: TGroupBox;
        butMkPers_app: TButton;
        butDelDef_app: TButton;
        butDelPers_app: TButton;
        PnKillExe: TPanel;
        procedure FormCreate(Sender: TObject);
        procedure butDelDef_frClick(Sender: TObject);
        procedure butDelPers_frClick(Sender: TObject);
        procedure butMkPers_frClick(Sender: TObject);
        procedure butDelDef_appClick(Sender: TObject);
        procedure butMkPers_appClick(Sender: TObject);
        procedure butDelPers_appClick(Sender: TObject);
        procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
        procedure PnKillExeClick(Sender: TObject);
      private
        procedure PopProceeder(var Msg:TMessage); //message WM_SYSCOMMAND;
     
      protected
        procedure OnMessageApplicationParser(var Msg:TMsg; var Handled:Boolean);
      published
        procedure ShowAbout;
        procedure ShowPerf;
        procedure ICheckBox;
        procedure MalinRate;
        procedure InfoMode;
      end;
     
      TSubmenuItemBox = record
        Flag,                        //type de bouton
        ID,                          //identificateur unique mais dont la valeur arbitraire
        Extent: cardinal;            //code de correspondance entre les fenêtres
        Action: procedure of object; //procédure associée, toujours initialisée à NIL
        Caption: string;             //libellé
      end;
     
     
    var frSpeMenu   : TfrSpeMenu;
        SysCheck    : boolean = false;
        SwMenusExe  : boolean = false; //dit si les menus persos au niveau de la barre de tâches sont affichés
     
    const
        MN_BASE         = $0F;          //arbitraire
        MN_ALL          = MN_BASE + 1;  //l'item apparaît partout
        MN_Application  = MN_BASE + 2;  //l'item apparaît en bas de l'écran
        MN_frSpeMenu    = MN_BASE + 3;  //l'item apparaît seulement dans la fenêtre
     
        MaxSubItemCount = 10;  //MaxSubItemCount+1 items en vrac classés dans un tableau
                               //La position relative des cases du tableau sont corrélées
                               //à celle finale dans le menu. ATTENTION!! cela génère des
                               //décalages d'indice si vous déplacer une case.
    var
        SubsItems : array[0..MaxSubItemCount] of TSubmenuItemBox = (
                              //J'ai choisi des identificateurs (ID) arbitraire.
                              //Démarre à 800 pour les séparateurs, à 1024 pour les items
           ( Flag:MF_SEPARATOR;              ID:801;             Extent:MN_frSpeMenu;    Action: nil;  Caption:''),
           ( Flag:MF_STRING;                 ID:1025;            Extent:MN_frSpeMenu;    Action: nil;  Caption:'&A propos'+#9+'Ctrl+F1'),  //pour comment insérer un ShortCut
           ( Flag:MF_STRING;                 ID:1026;            Extent:MN_frSpeMenu;    Action: nil;  Caption:'&Performances'),
           ( Flag:MF_STRING;                 ID:SC_TASKLIST;     Extent:MN_Application;  Action: nil;  Caption:'&Menu démarrer'),  //évènement automatiquement de Windows
           ( Flag:MF_SEPARATOR;              ID:802;             Extent:MN_Application;  Action: nil;  Caption:''),
           ( Flag:MF_STRING or MF_UNCHECKED; ID:1027;            Extent:MN_Application;  Action: nil;  Caption:'&Case à cocher'),
           ( Flag:MF_STRING or MF_DISABLED;  ID:1028;            Extent:MN_Application;  Action: nil;  Caption:'Cliques ici un peu pour voir... hein ?'),
           ( Flag:MF_SEPARATOR;              ID:803;             Extent:MN_frSpeMenu;    Action: nil;  Caption:''),
           ( Flag:MF_STRING;                 ID:SC_MONITORPOWER; Extent:MN_frSpeMenu;    Action: nil;  Caption:'ATTENTION: Moniteur en veille'),
           ( Flag:MF_STRING;                 ID:1029;            Extent:MN_frSpeMenu;    Action: nil;  Caption:'Informations sur le mode ci-dessus'),
           ( Flag:MF_STRING or MF_DISABLED or MF_GRAYED;
                                             ID:1030;            Extent:MN_frSpeMenu;    Action: nil;  Caption:'Inactif')
    //Faîtes gaffe à l'évènement OnCreate si vous bougez des lignes
          );
     
    //Merci de laisser les ID uniques les uns par rapport aux autres...
     
    implementation
     
    {$R *.DFM}
     
    //================================================= GESTIONNAIRE
     
    var SysMen     : integer; //variable pour la récupération de handles
        SwMenusPrs : boolean = false; //dit si les menus persos sont affichés
            //Cette variable doit être interne à Unit1. C'est pour cela qu'elle est ici.
     
      procedure TfrSpeMenu.OnMessageApplicationParser(var Msg:TMsg; var Handled:Boolean);
      var M : TMessage;
      begin
        if Msg.message=WM_SYSCOMMAND then
          begin
            M.WParamLo:=Msg.wParam;   //Seul wParamLo est géré
            frSpeMenu.PopProceeder(M);
          end
        else inherited;
      end;
     
      procedure KillSystemMenu(Hwd:integer);
      begin
      //Les nombres suivants tapent dans les ID = 60 000, et déclarés dans WINDOWS.PAS
        SysMen:=GetSystemMenu(Hwd,false);
        DeleteMenu(SysMen, SC_MAXIMIZE, MF_BYCOMMAND);
        DeleteMenu(SysMen, SC_MINIMIZE, MF_BYCOMMAND);
        DeleteMenu(SysMen, SC_SIZE, MF_BYCOMMAND);
        DeleteMenu(SysMen, SC_RESTORE, MF_BYCOMMAND);
        DeleteMenu(SysMen, SC_MOVE, MF_BYCOMMAND);
      end;
     
      procedure NoClosePossible(Hwd:integer);
      begin
        SysMen:=GetSystemMenu(Hwd,false);
        DeleteMenu(SysMen, SC_CLOSE, MF_BYCOMMAND);
      end;
     
      procedure MkInnerItems(Hwd,Extension:integer);
      var i : integer;
      begin
        SysMen:=GetSystemMenu(Hwd,false);
        for i:=0 to MaxSubItemCount do
          if (SubsItems[i].Extent=Extension) or (SubsItems[i].Extent=MN_ALL) then
            AppendMenu(SysMen, SubsItems[i].Flag, SubsItems[i].ID, PChar(SubsItems[i].Caption));
      end;
     
      procedure KillInnerItems(Hwd,Extension:integer);
      var i : integer;
      begin
        SysMen:=GetSystemMenu(Hwd,false);
        for i:=0 to MaxSubItemCount do
          if (SubsItems[i].Extent=Extension) or (SubsItems[i].Extent=MN_ALL) then
            DeleteMenu(SysMen, SubsItems[i].ID, MF_BYCOMMAND);
      end;
     
      procedure TfrSpeMenu.PopProceeder(var Msg:TMessage);
      var i : integer;
      begin
        inherited;
        for i:=0 to MaxSubItemCount do
          if SubsItems[i].ID=Msg.WParamLo then
            begin
              if Assigned(SubsItems[i].Action) then
                SubsItems[i].Action;  //On lance l'évènement associé à l'item
              Break;
            end;
      end;
     
      function ChangeMenuState(Hwd, Flag, Ident: integer):boolean;
      begin
        ChangeMenuState:=ModifyMenu(
            GetSystemMenu(Hwd,false),         //on prend le menu de l'Application
            SubsItems[Ident].ID,              //on précise l'identificateur (d'où l'utilité qu'il soit unique
            MF_BYCOMMAND or Flag,             //un flag de style, couplé à un paramétreur de paramètre de position (euh?)
            SubsItems[Ident].ID,              //on garde le même ID
            PChar(SubsItems[Ident].Caption)   //texte
        );
      end;
     
      function ChangeMenuCheckState(Hwd:integer; Value:boolean; Ident:integer):boolean;
      const CheckingTbl : array[boolean] of integer = (MF_UNCHECKED, MF_CHECKED);
      var Flag : integer;
      begin
        Flag:=(SubsItems[Ident].Flag) and (not MF_CHECKED) and (not MF_UNCHECKED);
        Flag:=Flag or CheckingTbl[Value];
        ChangeMenuCheckState:=ChangeMenuState(Hwd, Flag, Ident);
      end;
     
      function SetMenuEnabledState(Hwd:integer; Value:boolean; Ident:integer):boolean;
      const EnablingTbl : array[boolean] of integer = (MF_ENABLED, MF_DISABLED);
      var Flag   : integer;
      begin
        Flag:=(SubsItems[Ident].Flag) and (not MF_DISABLED) and (not MF_ENABLED);
        Flag:=Flag or EnablingTbl[Value];
        SetMenuEnabledState:=ChangeMenuState(Hwd, Flag, Ident);
      end;
     
      function GetMenuStyle(Hwd:integer; Ident:integer):TMenuItemInfo;
      var MnItms : TMenuItemInfo;
      begin
        GetMenuItemInfo( GetSystemMenu(Hwd,false),
                         Ident, false,              //on sélectionne par l'ID
                         MnItms );                  //retour des résultats
        GetMenuStyle:=MnItms;
      end;
     
      function HasMenuStyle(Style, Key : integer):boolean;
      begin
        HasMenuStyle:= (Style and (not Key))=Key; //que de la logique ;) !!
      end;
     
    //================================================= INTERFACE VISUELLE DE L'APPLICATION
     
    procedure TfrSpeMenu.FormCreate(Sender: TObject);
    begin
      Application.OnMessage:=OnMessageApplicationParser;
    //ATTRIBUTION DES EVENEMENTS
      SubsItems[1].Action:=ShowAbout;
      SubsItems[2].Action:=ShowPerf;
      SubsItems[5].Action:=ICheckBox;
      SubsItems[6].Action:=MalinRate;
      SubsItems[9].Action:=InfoMode;
    end;
     
    procedure TfrSpeMenu.butDelDef_frClick(Sender: TObject);
    begin
      KillSystemMenu(frSpeMenu.Handle);
    end;
     
    procedure TfrSpeMenu.butDelPers_frClick(Sender: TObject);
    begin
      KillInnerItems(frSpeMenu.Handle,MN_frSpeMenu);
      SwMenusPrs:=false;
    end;
     
    procedure TfrSpeMenu.butMkPers_frClick(Sender: TObject);
    begin
      MkInnerItems(frSpeMenu.Handle, MN_frSpeMenu);
      SwMenusPrs:=true;
    end;
     
    procedure TfrSpeMenu.butMkPers_appClick(Sender: TObject);
    begin
      MkInnerItems(Application.Handle, MN_Application);
      SwMenusExe:=true;
    end;
     
    procedure TfrSpeMenu.butDelPers_appClick(Sender: TObject);
    begin
      KillInnerItems(Application.Handle,MN_Application);
      SwMenusExe:=false;
    end;
     
    procedure TfrSpeMenu.butDelDef_appClick(Sender: TObject);
    begin
      SysCheck:=false; //si nouvelle création, alors non coché par défaut
      KillSystemMenu(Application.Handle);
    end;
     
    //================================================= EVENEMENTS LOGICIEL
     
    procedure TfrSpeMenu.ShowAbout;
    begin
      ShowMessage('Tu sais pas lire ?   ;)');
    end;
     
    procedure TfrSpeMenu.ShowPerf;
    begin
      ShowMessage('Ce programme est plutôt très très intéressant.');
    end;
     
    procedure TfrSpeMenu.ICheckBox;
    begin
      SysCheck:=not SysCheck;
      if ChangeMenuCheckState(Application.Handle,SysCheck,5) then
        begin
          SetMenuEnabledState(Application.Handle, not SysCheck, 6);
          ShowMessage('Vous pouvez peut-être cliquer maintenant là où vous ne pouviez pas tout à l''heure...');
        end;
    end;
     
    procedure TfrSpeMenu.MalinRate;
    begin
      NoClosePossible(Application.Handle);
      NoClosePossible(frSpeMenu.Handle);
      PnKillExe.Caption:='Cliques ici pour quitter...';
      PnKillExe.Font.Style:=[fsBold];
      ShowMessage('T''as triché en cochant la case à cocher... pff !!'+#13#10#13#10+
                  'Pour la peine, je t''interdis définitivement de fermer l''application. Au moins une bonne '+
                  'raison pour comment faire des boîtes de dialogue non closables avec la croix.'+#13#10#13#10+
                  'Mais comme je suis sympa, je t''active un beau bouton pour partir quand même 8=)');
    end;
     
    procedure TfrSpeMenu.InfoMode;
    begin
      ShowMessage('Si vous mettez en veille et appuyez sur ESPACE alors que le bouton "Créer perso" est focusé, '+
                  'alors Windows considére l''ESPACE comme commande de fin de veille, mais aussi comme clic équivalent '+
                  'sur le bouton. Ainsi, des items ont été rajoutés. Utiliser de préférence la touche ECHAP pour fermer.');
    end;
     
    procedure TfrSpeMenu.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
    //EXEMPLE DE GESTION DES SHORTCUT PERSONELS DANS LES MENUS
      if ((Key=VK_F1) and (Shift = [ssCtrl])) and
         (SwMenusPrs) and                             //l'évaluation est couperet
         (Assigned(SubsItems[1].Action)) then
       SubsItems[1].Action;
    end;
     
    procedure TfrSpeMenu.PnKillExeClick(Sender: TObject);
    begin
      if Copy(PnKillExe.Caption,1,1)<>'J' then
        begin
          ShowMessage('Ce fut une belle démo... non ?');
          Application.Terminate;
        end;
    end;
     
    end.
    @+,

    Cincap

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    re cincap

    Merci pour le lien, mais, j'y suis déjà passer, ce source est sur code source
    C'est dommage, à chaque fois que tu essai de m'aider, j'y suis déjà passer
    Comme tu peut le constater, j'ai compris la procédure pour agir avec les menus.

    Mais mon but, c'est d'agir avec les popupmenus, autrement dit, les menus flottants, ceux que l'ont affiche avec un click droit, et là, c'est une autre histoire.

  18. #18
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 450
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 450
    Points : 1 336
    Points
    1 336

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    Non, désoler cincap .
    Le premier lien te sert à récuperer le handle, mais cette fois-ci en passant par le process de l'appli (pas besoin de ça, je passe directement via findwindow)
    Et le 2ème, il te sert à recup du texte sur une appli, mais j'ai déjà poster ce code sur la première page...
    Merci quand même

  20. #20
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut yannfrance,
    Citation Envoyé par yannfrance Voir le message
    Bon, j'ai enclencher la vitesse escargot, ce qu'il me permet d'avancer tres lentement, mais au moin, j'avance

    Regarde ça ero-sennin , ça va t'interresser et moi aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Var monhandle, hmenu,ncount : Integer;
    begin
     monhandle:= FindWindow(Nil, 'Sans titre - Bloc-notes');
     label1.Caption:= IntToStr(monhandle);
     hmenu := GetMenu(monhandle);
     ncount := GetMenuItemCount(hmenu);
     Label2.Caption:= inttostr(ncount);
    En faite, je crois que c'est inutile d'agir directement sur la classe #32768
    Il faut récuperer les menu via la fenêtre parente pour agir
    ca avance doucement, mais je vais y arriver
    Je viens de tester le code, mais j'ai un gros gros doute sur sa fiabilité. Si par exemple, on a un dans notre application cliente 3 PopupMenu , comment sais-tu laquelle est affichée, laquelle tu vas devoir prendre ?
    J'ai fait un test avec Notepad ++, et ça ne colle pas à mes attentes

    Donc certes, on a des résultats, reste qu'il faut savoir les interpréter correctement...
    Ralala, j'espère ne pas trop avoir casser ton moral
    Allez, je vais voir si je peux trouver des choses intéressantes à ce sujet.
    Je reviendrais y mettre mes trouvailles si jamais j'arrive à quelque chose

    Sur ce, bon courage (une fois de plus :p)
    A+

Discussions similaires

  1. Question : PopupMenu.Items[ ].visible
    Par JJJJJ dans le forum Débuter
    Réponses: 9
    Dernier message: 03/07/2009, 14h25
  2. TListview ClicDroit vers PopupMenu et pas d'item
    Par James_ dans le forum C++Builder
    Réponses: 9
    Dernier message: 02/10/2007, 17h00
  3. couleur pour item dans popupmenu
    Par boopix dans le forum C++Builder
    Réponses: 4
    Dernier message: 21/08/2006, 21h40
  4. PopupMenu et Item->Caption
    Par Franck26 dans le forum C++Builder
    Réponses: 2
    Dernier message: 30/10/2005, 11h00
  5. PopupMenu sur item de TListBox
    Par nmathon dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/03/2003, 17h28

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