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

C++Builder Discussion :

Comment gerer une Barre de menus en connaissant le Handle


Sujet :

C++Builder

  1. #1
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut Comment gerer une Barre de menus en connaissant le Handle
    Bonsoir.
    Je cherche le moyen de pouvoir utiliser les menus deroulants de Visual Basic pour Excel, je suis parvenu a recuperer le Handle de la Barre de menus, mais la je seche lamentablement je ne trouve pas comment faire pour gerer cette barre, pour qu'elle reagisse a une simulation du clavier par programme avec les evenements claviers
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Je viens de trouver comment faire:
    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
     
    // on selectionne la Barre de menus
       SetForegroundWindow(h5);
    // on active le premier element de la Barre de menus pour cela on simule "Alt"
       PostMessage(h5, WM_KEYDOWN, VK_MENU, 0);
       PostMessage(h5, WM_KEYUP, VK_MENU, 0);
    // on simule la fleche vers la droite pour se deplacer dans le menu
       PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0); // touche enfoncee
       PostMessage(h5, WM_KEYUP, VK_RIGHT, 0); // touche relevee
    ...
    ...
    // on simule la fleche vers le bas pour derouler le menu selectionne
       PostMessage(h5, WM_KEYDOWN, VK_DOWN, 0);
       PostMessage(h5, WM_KEYUP, VK_DOWN, 0);
    ...
    ...
    // on simule la touche entree pour afficher la boite de dialogue
       PostMessage(h5, WM_KEYDOWN, VK_RETURN, 0);
       PostMessage(h5, WM_KEYUP, VK_RETURN, 0);
    il me reste a trouver comment naviguer dans la boite de dialogue que je sais ouvrir.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Je ne parviens pas a recuperer le Handle de la boite de dialogue que je viens d'ouvrir par programme j'ai pourtant utiliser les memes fonctions je ne vois pas mon erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HWND h6 = FindWindow("#32700", "VBAProject - Propriété du projet");
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    La je suis arrive a recuperer les Handle des TEdit de la boite de dialogue, mais je n'arrive pas a passer un texte dans ces TEdit j'utilise la fonction ci dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // mot de passe
    String PassWord = "Mon_mot_de_passe";
    // on selectionne le TEdit Mot de passe
       SetForegroundWindow(h9);
       PostMessage(h9, WM_SETTEXT, 0, (LPARAM)PassWord.c_str());
    J'ai essaye avec ou sans la fonction de selection "SetForegroundWindow(h9);", je pense qu'il y a quelque chose de mal ecrit mais je ne trouve pas.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    J'ai reussi a ecrire dans le TEdit, c'est la fonction "PostMessage" qui n'attend pas que le composant soit selectionne, quand il y a un timing a respecter il faut mieux utiliser "SendMessage".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // mot de passe
    String MPassWord = "jp";
    // on selectionne le TEdit Mot de passe
       SendMessage(h9, WM_SETTEXT, 0, (LPARAM) MPassWord.c_str());
    Je termine mon programme et je posterais le code complet.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Il me reste encore un petit probleme je n'arrive pas a cocher une CheckBox, je ne vois pas comment faire
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  7. #7
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Pour cocher le CheckBox j'ai utilise un exemple de "CGI" qui preconise de simuler la barre d'espace.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // on donne le Focus au CheckBox
       SetForegroundWindow(h9);
    // on simule l'appui de la barre d'espace pour cocher le CheckBox
        keybd_event(VK_SPACE,0,0,0);
        keybd_event(VK_SPACE,0,KEYEVENTF_KEYUP,0);
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  8. #8
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Alors la je suis parvenu a mes fin je peu par programme deverrouiller un programme Visual Basic pour Excel connaissant le code bien sur.
    le code:
    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
     
    Variant vbProj = vXLWorkbook.OlePropertyGet("VBProject");
    vMSExcel.OlePropertyGet("VBE").OlePropertyGet("ActiveVBProject") = vbProj;
    vMSExcel.OlePropertyGet("VBE").OlePropertyGet("MainWindow").OlePropertySet("Visible", true);
    //vMSExcel.OlePropertyGet("VBE").OlePropertyGet("MainWindow").OlePropertySet("Name", "essais.prn");
    vXLWorkbook.OlePropertyGet("VBProject");
    //vMSExcel.OlePropertyGet("VBE").OlePropertyGet("CommandBars", 1).OlePropertyGet("FindControl", 2578, true).OleFunction("Execute");
    HWND h = FindWindow("wndclass_desked_gsk", NULL);
    HWND h1 = FindWindowEx(h, NULL, "MsoCommandBarDock", "MsoDockLeft");
    HWND h2 = FindWindowEx(h, h1, "MsoCommandBarDock", "MsoDockRight");
    HWND h3 = FindWindowEx(h, h2, "MsoCommandBarDock", "MsoDockTop");
    // les deux Handles suivant dependent de h3
    HWND h4 = FindWindowEx(h3, NULL, "MsoCommandBar", "Standard");
    HWND h5 = FindWindowEx(h3, h4, "MsoCommandBar", "Barre de menus");
    // on selectionne la Barre de menus
       SetForegroundWindow(h5);
    // on active le premier element de la Barre de menus pour cela on simule "Alt"
       PostMessage(h5, WM_KEYDOWN, VK_MENU, 0);
       PostMessage(h5, WM_KEYUP, VK_MENU, 0);
    // on simule la fleche vers la droite pour se deplacer dans le menu
       PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0); // touche enfoncee
       PostMessage(h5, WM_KEYUP, VK_RIGHT, 0); // touche relachee
       PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0);
       PostMessage(h5, WM_KEYUP, VK_RIGHT, 0);
       PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0);
       PostMessage(h5, WM_KEYUP, VK_RIGHT, 0);
       PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0);
       PostMessage(h5, WM_KEYUP, VK_RIGHT, 0);
       PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0);
       PostMessage(h5, WM_KEYUP, VK_RIGHT, 0);
       PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0);
       PostMessage(h5, WM_KEYUP, VK_RIGHT, 0);
       PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0);
       PostMessage(h5, WM_KEYUP, VK_RIGHT, 0);
       PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0);
       PostMessage(h5, WM_KEYUP, VK_RIGHT, 0);
    // on simule la fleche vers le bas pour derouler le menu selectionne
       PostMessage(h5, WM_KEYDOWN, VK_DOWN, 0); // touche enfoncee
       PostMessage(h5, WM_KEYUP, VK_DOWN, 0); // touche relachee
       PostMessage(h5, WM_KEYDOWN, VK_DOWN, 0);
       PostMessage(h5, WM_KEYUP, VK_DOWN, 0);
       PostMessage(h5, WM_KEYDOWN, VK_DOWN, 0);
       PostMessage(h5, WM_KEYUP, VK_DOWN, 0);
       PostMessage(h5, WM_KEYDOWN, VK_DOWN, 0);
       PostMessage(h5, WM_KEYUP, VK_DOWN, 0);
       PostMessage(h5, WM_KEYDOWN, VK_DOWN, 0);
       PostMessage(h5, WM_KEYUP, VK_DOWN, 0);
    // on simule la touche entree pour afficher la boite de dialogue
     // touche enfoncee
       PostMessage(h5, WM_KEYDOWN, VK_RETURN, 0);
       PostMessage(h5, WM_KEYUP, VK_RETURN, 0); // touche relachee
    // ici la boite de dialogue est ouverte
    // on recupere le Handle de la premiere page de la boite de dialogue
    Sleep(500); // voir ci dessus SendMessage ?
    HWND h66 = FindWindow("#32770", "VBAProject Mot de passe");
    HWND h77 = FindWindowEx(h66, NULL, "Edit", NULL);
    HWND h88 = FindWindowEx(h66, NULL, "Button", "OK");
    // mot de passe
    String MPassWord = "jp";
    // on selectionne le TEdit Mot de passe
       SendMessage(h77, WM_SETTEXT, 0, (LPARAM) MPassWord.c_str());
    //Sleep(500);
    // ici on valide par OK
    // le programme est verrouille
    // on donne le Focus au Boutton "OK"
       SetForegroundWindow(h88);
    // on simule la touche entree
        keybd_event(VK_RETURN,0,0,0);
        keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
    Sleep(1000);
    HWND h6 = FindWindow("#32770", "VBAProject - Propriétés du projet");
    HWND h7 = FindWindowEx(h6, NULL, "#32770", NULL);
    // on selectionne la Boite de dialogue
       SetForegroundWindow(h7);
    // on simule la combinaison Shift+Tab
        keybd_event(VK_SHIFT,0,0,0);
        keybd_event(VK_TAB,0,0,0);
        keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0);
        keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
    // on envoye le code clavier pour changer de page
    // fleche vers la droite
        keybd_event(VK_RIGHT,0,0,0);
    // temporisation de stabilisation du changement de page
    Sleep(500); // voir ci dessus SendMessage ?
    // ici on recupere le Handle de la deuxieme page de la boite de dialogue
    // on recupere le Handle des TEdit pour y inscrire le Password
    HWND h8 = FindWindowEx(h6, NULL, "#32770", NULL);
    HWND h9 = FindWindowEx(h8, NULL, "Button", "&Verrouiller le projet pour l'affichage");
    HWND h10 = FindWindowEx(h8,h9, "Edit", NULL);
    HWND h11 = FindWindowEx(h8, h10, "Edit", NULL);
    HWND h12 = FindWindowEx(h6, NULL, "Button", "OK");
    // on donne le Focus au CheckBox
       SetForegroundWindow(h9);
    // on simule l'appui de la barre d'espace pour cocher le CheckBox
        keybd_event(VK_SPACE,0,0,0);
        keybd_event(VK_SPACE,0,KEYEVENTF_KEYUP,0);
    // mot de passe
    //String MPassWord = "Mot_Pass";
    // on selectionne le TEdit Mot de passe
       SendMessage(h10, WM_SETTEXT, 0, (LPARAM) MPassWord.c_str());
    // on selectionne le TEdit Confirmer le mot de passe
       SendMessage(h11, WM_SETTEXT, 0, (LPARAM) MPassWord.c_str());
    // ici on valide par OK
    // le programme est verrouille
    // on donne le Focus au Boutton "OK"
       SetForegroundWindow(h12);
    // on simule la touche entree
        keybd_event(VK_RETURN,0,0,0);
        keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
    Le code n'est pas optimise il a ete teste sous Window XP Pro Pack1 et Excel 2003.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VCL] Comment faire une barre d'outils skinable comme FireFox ?
    Par DarkChamallo dans le forum Composants VCL
    Réponses: 23
    Dernier message: 07/05/2008, 18h03
  2. [Conception][HSQLDB] Comment gérer une BD comme un seul fichier ?
    Par calogerogigante dans le forum Persistance des données
    Réponses: 7
    Dernier message: 14/03/2006, 15h45
  3. Réponses: 1
    Dernier message: 01/12/2005, 17h52
  4. Comment faire une Barre de Menu?
    Par gamerome dans le forum OpenGL
    Réponses: 5
    Dernier message: 18/02/2005, 14h46
  5. comment gerer une TStringGrid
    Par madison59 dans le forum C++Builder
    Réponses: 3
    Dernier message: 01/03/2004, 15h03

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