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

Windows Discussion :

cliquer sur une autre application


Sujet :

Windows

  1. #1
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 453
    Points
    1 453
    Par défaut cliquer sur une autre application
    Bonjour
    Je veux à partir d'une application (écrite sous Delphi) cliquer sur une autre application pour mettre des images dans le presse papier et les récupérer.
    J'utilise des séquences du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    setcursorpos(rref.Left+47,rref.Top+30);
    mouse_event( MOUSEEVENTF_LEFTDOWN,0,0,0 ,0);
    //application.ProcessMessages;  beep;
    mouse_event( MOUSEEVENTF_LEFTup,0,0,0 ,0);
    Le problème est que ces événements sont pris en compte de façon aléatoire. Une séquence d'images 1 à 10 me donnera :1 2 3 3 5 6 6 8 8 10. La ligne précédée de // est une tentative de forcer l'éxécution, sans succès. Des "sleep" ou des répétitions ne marchent pas mieux.
    Connaissez-vous un moyen de forcer la prise en compte de ces événements ?
    Merci
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Il est nettement préférable d'utiliser les API de l'application cible si c'est un server DDE ou COM.

  3. #3
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 453
    Points
    1 453
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Il est nettement préférable d'utiliser les API de l'application cible si c'est un server DDE ou COM.
    Si je dois user de ce genre de truc, c'est bien parce que je ne sais RIEN de cette appli.
    Aujourd'hui il s'agit de VidCap, qui affiche les images de ma webcam à l'écran, et je veux capturer des images fixes à des moments précis. Les clics correspondent aux éléments de menu "Edit" et "Copy", et je récupère l'image dans le presse papier. Il semble qu'en mettant un sleep(100) entre les clics et la récup, çà marche, mais j'ai une confiance limitée.
    Donc si quelqu'un a une idée pour faire faire son boulot à Windows, merci !
    P.S. Pour juste récupérer l'image, je peux aussi faire un snapshot de l'écran.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Le boulot de Windows est d'envoyer les messages aux fenêtres, leurs interprétations c'est le boulot de l'application, et c'est encore heureux.

    Votre boulot, c'est de faire une application qui utilise les interfaces documentées.

    Si vous ne conformez pas à ces règles, ne vous attendez pas à ce que les autres ait pensé à votre mode d'utilisation d'une application selon un procédé obscur.

  5. #5
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 453
    Points
    1 453
    Par défaut
    Voilà une conception originale de l'entraide !
    Merci
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Si dire que ce que font les autres, c'est de la m****. C'est normal de ce prendre des râteaux.

    Donc commencez par cherchez si les concepteurs de l'application ont mis en place un mécanisme d'automation.

  7. #7
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Citation Envoyé par Nebulix Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    setcursorpos(rref.Left+47,rref.Top+30);
    mouse_event( MOUSEEVENTF_LEFTDOWN,0,0,0 ,0);
    //application.ProcessMessages;  beep;
    mouse_event( MOUSEEVENTF_LEFTup,0,0,0 ,0);
    Essaye de mettre GetMessageExtraInfo() dans le dernier paramètre. Je crois que ce paramètre contient des infos temporelles pour conserver la chronologie des mousedown-mouseup (mais MSDN n'est pas très explicite là-dessus).

    par contre:
    Note This function has been superseded. Use SendInput instead.
    et un des paramètres de SendInput contient explicitement un champ time.

  8. #8
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 453
    Points
    1 453
    Par défaut
    @10_GOTO_10 merci. Je suis allé voir sur MSDN et n'ai rien compris (une fois de plus )
    Pour ceux que celà intéresse :
    Pour récupérer l'image qui m'intéresse, la fenêtre de l'appli vidcapp étant visible j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    keybd_event(44{VK_SNAPSHOT},0,0,0);//    Capture d'ecran du Bureau
    application.processmessages;   //permet que le snapshot soit effectué
    if Clipboard.HasFormat(cf_BitMap) then// si le clipBoard contient un bitmap >> dans Image1
    aBitmap.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0);
    La deuxième ligne m'a été soufflée par Andnotor sur le forum
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 699
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 699
    Points : 13 138
    Points
    13 138
    Par défaut
    SendInput va simplement garantir que le buffer de clavier sera rempli en une fois et qu'aucune autre "frappe" ne s'immiscera au milieu. Une boucle sur keybd_event par exemple n'empèche pas l'utilisateur de presser la touche Shift au milieu et ainsi de commuter la fin de l'envoi en majuscule

    Mais pour en revenir à ton cas, il faudrait au minimum faire une pause entre le mouvement du curseur et le click. Mais comme dit bacelar, c'est bancale, ça fonctionnera peut-être sur ton PC (à coup de Sleep dans tout les coins), mais pas sur celui du voisin 2x plus lent...

    Sinon par rapport à un PrintScreen, tu pourrais essayer de récupérer uniquement le DC du contrôle affichant le bitmap et de faire uniquement une copie de cette zone.

  10. #10
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 453
    Points
    1 453
    Par défaut
    D'après le peu que j'ai cru comprendre les évènements souris se rangent dans une queue et donc devraient rester synchronisés sans attente. Par contre rien ne semble prévu pour que l'écriture et la lecture du presse papier par 2 applis différentes le soient ! Ce qui fait marcher la copie d'écran est le fait que l'événement porte sur windows et pas l'appli particulière et peut donc être synchronisé par processmessages.
    Le fait qu'il n'y ait pas de problème quand on clique pour de vrai à la main vient-il seulement du fait qu'on opère lentement ou bien y a-t-il une différence cdans les traitements ?
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  11. #11
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Mais pour en revenir à ton cas, il faudrait au minimum faire une pause entre le mouvement du curseur et le click. Mais comme dit bacelar, c'est bancale, ça fonctionnera peut-être sur ton PC (à coup de Sleep dans tout les coins), mais pas sur celui du voisin 2x plus lent...
    A mon avis, ce n'est pas utile de faire une pause: si les évènements ont la valeur time bien renseignée, ils seront traités dans le bon ordre quel que soit le PC. Il n'y a aucune raison que ce soit bancal, la plupart des claviers virtuels fonctionnent comme ça (et peut-être aussi les réels, je ne sais pas comment sont faits les drivers clavier).

    Sinon, pour en revenir au problème de départ: si le but est juste de récupérer l'image d'une fenêtre, as-tu essayé d'envoyer le message WM_PRINTCLIENT à la fenêtre ? C'est la façon de faire prévue par le système, ça devrait fonctionner dans tous les cas.

  12. #12
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 699
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 699
    Points : 13 138
    Points
    13 138
    Par défaut
    Ok pour le délai et l'enchaînement des commandes. Mais je ne vois pas trop le rapport avec un clavier virtuel...

    De toute façon, qu'il s'agisse de souris, de clavier ou de toute autres formes de message, l'OS les traitera quand il aura le temps. Je ne vois pas sur ce principe comment on pourrait garantir que sur 10 prises de vue, il n'y ait pas des images redondantes.

Discussions similaires

  1. Graphisme sur une autre application windows
    Par scat64 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 02/02/2012, 21h47
  2. Action appelant une action sur une autre application + plus flux xml
    Par Cybero dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 11/01/2011, 16h05
  3. Détecter clic de souris sur une autre application
    Par xenos dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 05/08/2010, 09h18
  4. Focus sur une autre application
    Par labrute dans le forum C++
    Réponses: 8
    Dernier message: 06/04/2009, 10h57
  5. Cliquer sur un bouton dans une autre application
    Par FredericB dans le forum C++Builder
    Réponses: 16
    Dernier message: 10/05/2008, 17h23

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