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 :

API win32 - Accès aux données d'une autre application


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Points : 21
    Points
    21
    Par défaut API win32 - Accès aux données d'une autre application
    Salut,

    dans le cadre de mon travail, j'utilise un application pour suivre les employés et communiquer avec eux.
    Le problème est qu'elle a été codée avec les pieds et est très peu ergonomique. Son principal défaut étant d'ouvrir une popup en premier plan dès qu'un employé m'envoie un message (super pratique d'être coupé dans son travail toutes les 5 minutes !).
    Il est possible de désactiver l'affichage de cette popup mais il faut alors régulièrement aller consulter un onglet du logiciel pour voir si on a un nouveau message non lu. Les messages non lus sont stockés dans un list view.

    Je pensais donc coder une petite application qui utilise les API win32 pour régulièrement consulter le contenu de cette list view et avertir l'utilisateur de la présence de nouveaux messages par le biais d'une popup non intrusive.

    Ce que j'ai fait :
    - Utiliser EnumWindows pour lister les fenêtre ouvertes et détecter celle de l'application en question.
    - Utiliser EnumChildWindows sur la fenêtre détectée pour trouver la fenêtre fille contenant la list view qui m'intéresse.
    - Utiliser EnumChildWindows sur la fenêtre fille pour récupérer les handles des éléments qui la composent.

    Tout ça a été fait sans trop de difficulté mais là où je bloque c'est que contrairement à ce que je pensais, si je récupère le nom de la classe de ma list view, je n'obtiens pas un objet list view mais un objet dont le nom de classe est pbdw115 (j'ai vérifié à l'aide de WinSpy++, c'est bien ma "list view" qui porte ce nom).
    Si je refais un coup de EnumChildWindows sur le handle de cet élément, j'obtiens la liste d'enfants suivante :
    ScrollBar
    ScrollBar
    Static
    ScrollBar
    Static
    pbdwst115
    pbdwst115
    Edit
    Edit
    Edit
    Edit
    Edit
    pbdwst115
    Edit
    pbdwst115
    pbdwst115

    Aucun de ces éléments ne semble posséder d'enfant.
    Ma question est donc : est-ce que ça signifie que la list view est en fait un élément qui a été entièrement recodé par les développeurs ? Si c'est le cas, il y a quand même une approche qui pourrait me permettre d'avoir accès au contenu de la list view ?
    Je ne comprend pas à quoi correspondent les élement Edit (c'est une list view sur laquelle l'utilisateur a uniquement un accès en lecture, pas en écriture). Quelqu'un a une idée ?


    Merci d'avance pour les réponses et si vous avez besoin d'autres éléments, n'hésitez pas à demander (je répondrai dans la mesure du possible, l'environnement de travail étant virtualisé et n'ayant pas la possibilité d'y installer ce que je veux).

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Sur le coup, je ne vois pas trop.

    L'approche alternative serait d'exécuter l'application dans un debugger pour voir le code qu'elle utilise pour afficher sa popup, et possiblement le détourner (injection de DLL dans l'application, hook, API hooking, etc.)

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 48
    Points
    48
    Par défaut
    Bonjour,
    Si c'est une application réseau, cela ne serait-il pas plus simple de sniffer le port qu'utilise l'application pour détecter l'arrivée de message?

  4. #4
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Pourquoi ne refais -tu pas directement l'application complète avec un message non-intrusif (tray tip).

    Un système de message n'est vraiment pas complexe à coder.

    Peut-être bien moins que ce que tu cherche à faire.


  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Merci pour vos réponses, je suis désolé de ne pas avoir répondu plus tôt mais j'étais absorbé par le développement de ma petite application.

    sachadee -> impossible, je ne dispose pas des sources, l'application accède à une BDD sur laquelle je n'ai aucun droit et elle est bien trop complexe pour que ça soit "plus simple" de recréer l'appli.

    devbreizhbugs -> pas pris le temps d'approfondir cette approche.

    Médinoc -> Bien vu, c'est la solution que j'ai utilisé, j'ai injecté une DLL faite maison dans le processus. Cette DLL sous classe les éléments désirés et utilise les WindowMessage pour modifier le comportement de la fenêtre et en faire une vraie popup qui se fait discrète quand il le faut, qui attire l'oeil de l'utilisateur quand il y a un nouveau message et qui, surtout, ne vole pas le focus à tout bout de champ.

    Bon dimanche et à la prochaine.

    PS : si ma "ListView" porte comme nom de classe pbdw115 c'est parce que l'appli a été codée avec PowerBuilder 11.5 et que ma ListView n'est pas une ListView mais une DataWindow, objet créé par PowerBuilder. Après avoir consulté un forum spécialisé sur PowerBuilder j'ai totalement abandonné l'idée d'accèder au contenu de cette DataWindow.

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

Discussions similaires

  1. Accès aux propriétés d'une autre base
    Par Domi2 dans le forum VBA Access
    Réponses: 2
    Dernier message: 08/09/2007, 15h50
  2. Problème d'acces aux données d'une liste Chainée
    Par Le Payton dans le forum Langage
    Réponses: 4
    Dernier message: 27/08/2007, 12h00
  3. Acces aux composants d'une autre class
    Par Yann39 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 13/01/2007, 23h16
  4. [SQL][C#] Pas d'accès aux données d'une base SQL
    Par ridd21 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 20/06/2006, 11h46
  5. [VBA-A]Acces aux données d'une requête Access
    Par Yanmeunier dans le forum VBA Access
    Réponses: 7
    Dernier message: 28/02/2006, 13h21

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