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

WinDev Discussion :

Tuer un processus IE créé par l'activeX


Sujet :

WinDev

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Points : 1 283
    Points
    1 283
    Par défaut Tuer un processus IE créé par l'activeX
    Bonjour à tous!

    Je remarque que lorsque j'utilise plusieurs fois l'activex web browser il ouvre une instance de internet explorer (dans le gestionnaire de taches)

    Y a t-il un moyen de "killer" l'instance? une fonction du genre >>fermer

    J'ai regardé du coté de la fonction Libérer mais elle ne semble pas fonctionner sur l'activex IE, elle réclame un objet dynamique!!

    Merci d'avance pour toute aide!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Laos

    Informations forums :
    Inscription : Mars 2003
    Messages : 552
    Points : 1 193
    Points
    1 193
    Par défaut
    Bonjour,

    pourquoi ne pas lister les process avec ExeListeProcessus() puis tuer le process correspondant avec ExeTermine(PiD) ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 30
    Points : 37
    Points
    37
    Par défaut
    Bonjour à toutes et tous,

    Citation Envoyé par Ry_Yo Voir le message
    Bonjour,

    pourquoi ne pas lister les process avec ExeListeProcessus() puis tuer le process correspondant avec ExeTermine(PiD) ?
    Le problème avec cette solution est que ExeListeProcessus() nous renvoie (entres autres processus système) le processus lié à WINWORD.EXE et non les (sous)processus liés aux document word ouvert

    Pour mon test, j'ai ouvert (et enregistré) Test 1.doc et Test 2.doc.
    Dans le gestionnaire de tâches, on peut voir :

    Nom : process2.PNG
Affichages : 313
Taille : 10,5 Ko

    Aucun moyen d'accéder au processus lié à chaque fichier word ouvert ?

    Bien à vous !

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Laos

    Informations forums :
    Inscription : Mars 2003
    Messages : 552
    Points : 1 193
    Points
    1 193
    Par défaut
    Bonjour,

    Dans ce cas là, votre seul solution est de passer par une API windows, en l'occurrence user32.dll et la méthode GetWindow() pour lister toutes les fenêtres ouvertes dans windows
    Puis de vous servir de l'api kernel32.dll et de la methode TerminateProcess() pour fermer (violemment ) la fenêtre voulu.

    Je n'ai plus le code en tête mais je l'avais trouvé grace à mon ami google.

    Cordialement.

    PS : ça c'est du détérage de post je ne me rappelais même plus de ce message

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 30
    Points : 37
    Points
    37
    Par défaut
    Wow

    Je suis impressionné par votre vitesse !

    Merci, je vais creuser cette piste !

  6. #6
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    Quel(s) activeX utilises-tu ? Il n'y a pas de méthodes de fermeture de documents dedans ? Le massacre () de processus est à éviter si possible.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 30
    Points : 37
    Points
    37
    Par défaut
    Salut, c'est un activex word. Si, bien sûr, il existe la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    word>>ActiveDocument>>Close(Faux)
    pour fermer le document actif mais de temps en temps, ça ne marche pas.

    Du coup, je récupère le PID (gnPIDword) du processus lié au fichier word ouvert par mon programme et je lance de façon radicale les deux commandes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SI PAS ExeTermine(gnPIDword) ALORS
    	DDELance("TSKILL " + gnPIDword)
    FIN
    Au préalable, pour récupérer le PID, j'ai utilisé la procédure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PROCEDURE ProcRechercheFenetre(sFichierDoc est une chaîne,bTrace est un booléen=Faux)
    gnPIDword=0
    SELON bTrace
    	CAS Vrai 	:	API("User32","EnumWindows", &ProcEnumFenetre,sFichierDoc)
    	AUTRE CAS	:	API("User32","EnumWindows", &Proc_GetFenetrePID,sFichierDoc)
     
    FIN

  8. #8
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    J'utilise un système similaire afin de mettre un document word au premier plan.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TableSupprimeTout(TABLE_Process)
    AppelDLL32("User32", "EnumDesktopWindows", Null, &API_EnumerationFenêtres, "sChaineCherchee")
     
    POUR i = 1 _A_ TABLE_Process..Occurrence
    	SI ChaîneOccurrence(Majuscule(TABLE_Process.COL_Nom[i]),Majuscule(sChaineCherchee)) <> 0 ALORS
    		hWnd = TABLE_Process.COL_SHandle[i] // le handle (pas le pid!!!)
    		RetourFonction=API("USER32","SetWindowPos",hWnd,hWndInsertAfter,0,0,0,0,uFlags) // mise au premier plan de l'élément : c'est ici que tu dois le tuer...
    		SORTIR
    	FIN
    FIN
    Je charge la table avec la procedure "API_EnumerationFenêtres" :
    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
    PROCEDURE API_EnumerationFenêtres(nHwnd est un entier système, TitreApplication est une chaîne)
    nTailleMaxNomClasse est un entier = 1024
    sNomClasseDeFenetre est une chaîne ASCIIZ sur 1024
    sTitreFenetre est une chaîne
     
    // Récupération de la classe Windows de la fenêtre
    API("user32.dll", "GetClassNameA", nHwnd, &sNomClasseDeFenetre, nTailleMaxNomClasse)
    // Récupération du titre de la fenêtre
    sTitreFenetre = SysFenTitre(nHwnd)
    SI SansEspace(sTitreFenetre) <> "" ALORS
    	TableAjoute(TABLE_Process,sTitreFenetre + TAB + Val(nHwnd))
    FIN
    TitreApplication = "" // pour éviter warning
     
    RENVOYER Vrai
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  9. #9
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    Sais-tu pourquoi le close ne marche pas parfois ? un problème de document actif ? as-tu essayé de fermer le document par son nom ?
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2015
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 30
    Points : 37
    Points
    37
    Par défaut
    @frenchsting

    Merci pour ton code qui va m'aider à fiabiliser le mien (j'ai également des problèmes de fusion de documents word) !
    Les méthodes de la couche activex ne sont pas fiables à 100% du coup, en cas d'erreur, passer directement par l'API système me semble plus sûr (API user32.dll).

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/01/2011, 16h44
  2. Réponses: 9
    Dernier message: 18/12/2007, 11h43
  3. Réponses: 5
    Dernier message: 05/06/2007, 16h25
  4. Tuer des processus par leur nom
    Par tedparker dans le forum Access
    Réponses: 2
    Dernier message: 12/09/2006, 16h19
  5. Tuer un processus lance par system sous perl
    Par gedeon555 dans le forum Langage
    Réponses: 4
    Dernier message: 10/04/2006, 17h11

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