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

API, COM et SDKs Delphi Discussion :

FindWindow fonctionne une fois sur deux


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Avril 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2012
    Messages : 14
    Par défaut FindWindow fonctionne une fois sur deux
    Bonjour,

    Me revoilà avec une nouvelle question. Elle concerne FindWindow.

    Je sais qu'il existe déjà un certain nombre de sujet sur cette fonction, mais je n'ai pas réussi à trouver une réponse qui me convienne.

    Avec certains programmes ça marche, avec d'autres non. Par exemple, avec la Calculatrice de Windows, j'arrive à récupérer le handle mais avec le Bloc-notes, je n'ai jamais réussi. J'obtiens toujours un beau 0. Avec Filezilla ok, Thunderbird non. La liste est encore longue, je vous épargne ! Est-ce que c'est un problème de "titre" ? Je recopie simplement le titre de la fenêtre que je vois, mais est-ce qu'il y a une astuce ?

    Exemple d'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hand := FindWindow(nil, 'Sans titre - Bloc-notes');
    Ceci ne marche pas.

    J'exécute une application externe avec ShellExecute. Mais est-ce que je devrais plutôt utiliser CreateProcess ? Parce qu'avec CreateProcess, je pourrai récupérer différemment le handle d'une fenêtre ?

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    Utilise plutôt la classe dans ce cas, car effectivement comme tu l'as remarqué, le titre change en fonction de fichier ouvert ou du menu en cours (comme Delphi d'ailleurs en fonction du projet et aussi de la tache en cours)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hand := FindWindow('Notepad', nil);
    Ces codes te permettront de trouver rapidement trouver les classes de Filezilla ou Thunderbird
    WindowsSpy : Fenêtres survolées par la souris
    FERMER UNE AUTRE APLICATION à partir de la notre

    Par exemple
    Delphi = TAppBuilder
    Word = OpusApp
    Excel = XLMain


    Il existe ShellExecuteEx, je ne l'ai jamais utilisé, mais il renvoie plus d'info (dont hProcess) que ShellExecute
    CreateProcess c'est différent, tu as la main total sur le programme, tu as son ProcessID et ThreadID, tu peux donc énumérer des fenêtres très facilement !

    Avec FindWindow, tu n'as pas forcément ton instance mais la première trouvée !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    il FAUT passer par CreateProcess afin de retrouver la bonne fenêtre, car tu peux très bien avoir déjà une instance de l'application qui tourne et qui ne te concerne pas.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre averti
    Femme Profil pro
    Inscrit en
    Avril 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2012
    Messages : 14
    Par défaut
    Merci à vous deux.

    ShaiLeTroll, j'ai testé comme tu me l'as dit avec les classes de programme et effectivement ça fonction !
    Par contre, je ne vais pas pouvoir l'utiliser parce que dans mon application, je ne sais pas quelles sont les programmes qui vont être ouverts et fermés. Tout ceci ce fait à partir d'un fichier de configuration.
    Avec ShellExecuteEx, pourquoi pas. Le problème, c'est que du coup je devrais utiliser des variables globales pour stocker les handles lorsque je lance les exécutables. Je ne sais pas si c'est très conseillé.. ? L'idée serait de les stocker dans un TStringList histoire d'avoir le nom de l'application et son handle.

    Paul TOTH, je vais me documenter maintenant sur CreateProcess et voir si j'arrive à en faire quelque chose. Ça me semblait assez compliqué à côté de ShellExecute, mais si c'est plus propre, c'est mieux ! J'imagine que je risque d'avoir également des variables globales avec cette méthode.

    C'est juste cette histoire de variables globales qui me dérange un peu. Est-ce que c'est un problème à la base ?

    Je vous tiens au courant !

  5. #5
    Membre averti
    Femme Profil pro
    Inscrit en
    Avril 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2012
    Messages : 14
    Par défaut
    J'ai fait pas mal de recherches sur ShellExecuteEx et CreateProcess. Mais là je n'avance plus.

    ShellExecuteEx
    J'arrive à démarrer un application sans problème. Par contre, j'ai vu qu'on ne peut obtenir que le hprocess qui est le handle du processus. Or, j'ai besoin du handle de la fenêtre (pour pouvoir la positionner avec SetWindowPos et la fermer proprement avec un SendMessage).

    Apparemment avec enumWindow, qui liste toutes les fenêtres ouvertes, je pourrais comparer les HINSTANCES retournées par les deux fonctions. mais évidement ça ne marche pas.
    Je ne comprends pas bien ce que c'est ce HINSTANCE, sur ShellExecuteEx, je comprends ça comme un numéro d'erreur et dans enumWindow, (il faut faire un GetWindiowLong(GWL_HINSTANCE)) ça retournerait plutôt le numéro (handle probablement) d'une instance d'un programme.

    J'aurai pu aussi testé mon hprocessus du ShellExecuteEx si enumWindows retournait aussi le handle d'un processus, mais je crois que ce n'est pas le cas.

    CreateProcess
    J'ai eu pas mal de problème parce qu'il y a une différence entre les versions de Delphi (je suis en 2010). Mais j'ai finalement réussi à faire en sorte que ça ouvre une application, ça c'est bon.
    Je pensais ensuite que c'était très simple de récupérer le handle de la fenêtre que je lance. Mais je n'ai pas trouvé comment. D'après ce que j'ai compris, on peut récupérer le handle d'après le processus. J'ai vu ça dans la Faq. J'ai testé mais les handles ne correspondent pas à un FindWindow (juste pour tester avec la calculatrice de Windows). De plus, j'en ai seulement 4 qui sont affichés, je trouve ça bizarre.

    Je suis un peu perdue.

    Merci d'avance !

  6. #6
    Membre averti
    Femme Profil pro
    Inscrit en
    Avril 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2012
    Messages : 14
    Par défaut
    Pour information, j'utilise finalement FindWindow avec les deux paramètres possibles.

    Merci pour vos réponses.

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

Discussions similaires

  1. Mean Shift fonctionne une fois sur deux
    Par killshout dans le forum OpenCV
    Réponses: 0
    Dernier message: 19/09/2011, 00h43
  2. Ajax fonctionne une fois sur deux
    Par guillaume40 dans le forum jQuery
    Réponses: 8
    Dernier message: 02/07/2010, 23h42
  3. Eclipse fonctionne une fois sur deux
    Par crocodile dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 30/10/2009, 12h39
  4. Expression Régulière fonctionne une fois sur deux
    Par KoRiGaN44 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 03/07/2008, 19h07
  5. Réponses: 5
    Dernier message: 14/09/2007, 12h02

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