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 :

Simuler un click sur le menu d'une autre application


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Chef d’entreprise
    Inscrit en
    Mars 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef d’entreprise

    Informations forums :
    Inscription : Mars 2002
    Messages : 212
    Points : 149
    Points
    149
    Par défaut Simuler un click sur le menu d'une autre application
    Je simuler un click sur le menu d'une autre application.
    Je m'explique :
    Je veux à partir de mon application lancer un executable comme "paint" puis simuler l'accès au menu "Fichier>ouvrir" pour ouvrir la boîte de dialogue.

  2. #2
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 98
    Points : 74
    Points
    74
    Par défaut
    Salut
    ya plusieurs facons de leur fait , tu peux deja proceder comme ceci :
    - shellexecute paint
    tu prend le handle de paint.
    - setforegroundwindow(handlepaint)
    - Setcursorposition (
    ect...
    Sinon tu peux faire un Sendmessage(handlepaint,...,CTRL + o ) c'est plus simple de cette maniére .
    Documente toi sur les API que j'ai cité , la syntaxe n'est pas la bonne j'ai fait ca rapidement

  3. #3
    Membre habitué
    Profil pro
    Chef d’entreprise
    Inscrit en
    Mars 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef d’entreprise

    Informations forums :
    Inscription : Mars 2002
    Messages : 212
    Points : 149
    Points
    149
    Par défaut
    Merci.
    C'est un bon fil.
    Mais, j'ai encore une petite question, si j'utilise SetCursorPosition comment je pourrais connaitre la position du menu à cliquer?

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 98
    Points : 74
    Points
    74
    Par défaut
    Ya des utilitaires pr trouver la position du curseur, donc tu pourrais tester...
    mais si la resolution change , les valeurs changeront aussi ect...
    Donc c'est une facon assez bourrine si tu vois ce que je veux , il vaudrait mieux que tu utilises Sendmessage

  5. #5
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    pourqoi pas simuler les touches de racourcis?
    avec: key_event (voir dans la faq)
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  6. #6
    Membre habitué
    Profil pro
    Chef d’entreprise
    Inscrit en
    Mars 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef d’entreprise

    Informations forums :
    Inscription : Mars 2002
    Messages : 212
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par K.othmane
    Salut
    ya plusieurs facons de leur fait , tu peux deja proceder comme ceci :
    - shellexecute paint
    tu prend le handle de paint.
    Si je lance mon application spécifique chemin\monappli.exe, comment je fais pour récupérer le handle?

  7. #7
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Tout ça, c'est dans les sources du premier défi qui seront très très bientôt en ligne.
    Pour te faire patienter, voici un extrait de l'article :
    Ces fonctions sont pour la plupart regroupées dans l'unité UnitSystem.pas. Elle permettent entre autre :

    * de fermer une application externe si on connait le Handle de sa fiche principale (FermerApplication). Cette fonction est utilisée dans le OnClose de la fiche principale.
    * de simuler des clics de souris de deux façons différentes : clic réel et clic virtuel (voir les procédures MouseClickOnScreen et VirtualMouseClickOnWindow). La première procédure utilise la fonction de l'API mouse_event, la seconde utilise le sytème d'envoi de messages Windows classique avec PostMessage.
    * de simuler les frappe de clavier (voir les procédures SimulateKeyDown, SimulateKeyUp, SimulateKeystroke, et SendKeys). On doit noter ici que l'on trouve sur internet une unité SendKeys.pas, beaucoup plus complexe, sans doute plus aboutie, mais que je n'ai pas réussi à utiliser. Ici, j'ai essayé de rester simple et ça mieux marché en utilisant la fonction de l'API Windows keybd_event qui permet d'envoyer des évènement claviers à la fenètre de Windows qui possède le Focus...
    * ....Comment mettre le Focus sur une fenètre ? En cliquant sur sa barre de titre (voir la procédure ActiverFenetre)
    * d'obtenir la couleur d'un pixel d'une fenètre particulière (voir la fonction CouleurPixel qui utilise l'API Windows GetPixel).

    Pour mesurer le temps mis par mon programme pour résoudre une partie, je me suis appuyé sur la fonction API GetTickCount (méthodes StartChrono et StopChrono de la classe TStatistiques). En passant tous les calcul des statistiques sur les pourcentages de réussite ou d'échec du Bot-démineur sont dévolues à la classe TStatistiques, implémentée dans la variable globale Statistiques de l'unité UnitStats.pas.
    Et mes sources dans lequel tu trouvera l'unité qui te sera utile.

    Dans les sources, unité principale, tu trouveras aussi comment je lance le démineur, énumère les fenêtres ouvertes, identifie celle qui correspond au démineur et finalement récupère son Handle.

    Voilà
    Fichiers attachés Fichiers attachés
    Bidouilleuse Delphi

  8. #8
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  9. #9
    Membre habitué
    Profil pro
    Chef d’entreprise
    Inscrit en
    Mars 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef d’entreprise

    Informations forums :
    Inscription : Mars 2002
    Messages : 212
    Points : 149
    Points
    149
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      OpenDialog1.Execute;
      appname:=OpenDialog1.FileName;
      ShellExecute(0, 'OPEN',pchar(appname), nil, nil, SW_SHOWNORMAL);
      HInst := FindWindow(nil, 'Rainbow Technologies Sentinel');
      SetWindowPos(hInst, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or  
                SWP_NOSIZE or SWP_NOACTIVATE);
      SendMessage(Hinst,WM_KEYDOWN,VK_LMENU,0);
      SendMessage(Hinst,WM_KEYDOWN,ord(F),0);
      SendMessage(Hinst,WM_KEYUP,ord(F),0);
      SendMessage(Hinst,WM_KEYUP,VK_LMENU,0);
    J'ai écrit ce code pour simuler le Hot key Alt+F dans une application mais ça ne marche pas.
    Quelqu'un a-t-il une idée?

  10. #10
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Si tu fais une recherche sur le forum, il y a des fils de discussions où j'explique comment simuler les appuis de touches pour naviguer dans les menus.
    C'est aussi dans les sources que je t'ai fourni.

    Pour que celà fonctionne, il faut d'abord donner le Focus à la fenètre qui reçoit les messages clavier, sinon ça ne marche pas.
    Bidouilleuse Delphi

  11. #11
    Membre actif Avatar de Mattetfamilly
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 182
    Points : 201
    Points
    201
    Par défaut
    es-tu sûr de "ord(F)"?

    Vérifies le code exact de la touche 'F' en faisant un énènement OnKeyPress sur un Editeur. Le paramètre Key te permettra de vérifier exactement le code correspondant à la touche F.
    on aura tout vu...
    Mais où est-ce???...
    ------------------------------------------------------
    n'oublies pas les balises [code ][/code ]
    et le Tag

  12. #12
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    oui, normalement, c'est :
    ça marchera beaucoup mieux comme ça...
    Bidouilleuse Delphi

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    Bonjour à tous
    Dans la simulation de touches clavier, j'ai le probléme pour la touche \ en réalité la fonction écrit _ je suppose que l'on doit rajouter par les simulatekeydown puis Up des touches VK_CONTROL et VK_MENU mais sans résultat

    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
    Procedure ecrire(s:string);
    Var   i:integer;
          Flag: boolean;
          w: word;
    begin
    Flag:= not GetKeyState(VK_CAPITAL)=1;
    If Flag then  SimulateKeystroke(VK_CAPITAL,0);
    For i:=1 to length(s) do
        begin
        w:=VkKeyScan(s[i]);
        If ((HiByte(w)<>$FF) and (LoByte(w)<>$FF)) then
             begin
             If HiByte(w) =1 then  SimulateKeyDown(VK_SHIFT);
             SimulateKeystroke(LoByte(w),0);
             If HiByte(w) =1 then  SimulateKeyUp(VK_SHIFT);
             end else
             begin
             SimulateKeydown(VK_CONTROL);
             SimulateKeydown(VK_MENU);
             SimulateKeystroke(LoByte(w),0);
             SimulateKeyUp(VK_CONTROL);
             SimulateKeyUp(VK_MENU);
             end;
    end;
    If Flag  then  SimulateKeystroke(VK_CAPITAL,0);
    sleep(300);
    end;

    Merci pour votre aide

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/04/2015, 15h23
  2. Réponses: 4
    Dernier message: 08/10/2010, 14h59
  3. Cliquer sur un bouton dans une autre application
    Par FredericB dans le forum C++Builder
    Réponses: 16
    Dernier message: 10/05/2008, 17h23
  4. Réponses: 5
    Dernier message: 26/09/2007, 16h07

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