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

VBScript Discussion :

perte de focus sur une appli a cause dun script le controlant


Sujet :

VBScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 9
    Par défaut perte de focus sur une appli a cause dun script le controlant
    Bonjour,

    Apres de longues recherches sur notre ami Google, jai rien trouver a propos de mon probleme. Je fais donc appel a la population de ce forum pour m'aider, svp.

    Situation: Je lance depuis un logiciel de gestion commercial un script (vbs) pour lancer des impressions, mon script simulant les touches du clavier pour selectionner les diverses options necessaires (imprimante etc). Mais a 2 reprises en debut de script, jai besoin de faire un clic a la souris pour cocher une option, le clavier me permettant pas d'y acceder (avec 'tab'). Jai donc choisi d'afficher un msgbox specifiant de cocher cette option, puis l'utilisateur fait 'ok' sur mon msgbox et le script reprend. J'utilise egalement un 3ieme msgbox bloquant dans le script (pour une autre raison bref...)

    Probleme: A priori tout se passe bien comme je le veux sauf lors de l'apparition de la 3ieme Msgbox. Le bouton s'affiche bien demandant a l'utilisateur de faire 'ok' pour continuer le script. Mais dans ce cas, je n'ai plus la possibilité de cliquer dans mon logiciel, je n'arrive pas a remettre le focus sur cette appli en cliquant avec la souris. Je recupere la main sur mon appli seulement quand je clic sur 'ok' mais l'option que je voulais cocher n'est alors pas coché et le script continue son execution...

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    SUB Imprim(NomModele,typedoc)
        Dim oSheel
        Dim monBouton
        Dim etatBouton
     
        Set oSheel = Wscript.CreateObject("Wscript.Shell")
     
    if typedoc = 1 then
    'impression des etiquettes
    'bouton imprimer	
    	oSheel.SendKeys("+{F5}")   
    	Wscript.sleep(1000)
    	oSheel.SendKeys(NomModele)
     
     
    	etatBouton = 0
    	' vbYesNo
    	monBouton = msgbox("Appuyer sur ok quand le tri est selectionné",0,"En attente")
    	while etatBouton = 0
    		if monBouton = vbOk then 
    			etatBouton = 1
    		end if
    		Wscript.sleep(100)
    	Wend
     
     
    	While oSheel.appActivate("Sage 100 Gestion commerciale pour SQL Server - gecotest.gcm") <> True
    		WScript.Sleep 100
    	Wend
     
    	Wscript.sleep(300)
    	oSheel.SendKeys("{ENTER}")
                 ...
                 ...
    	oSheel.SendKeys("{ENTER}")
     
                 etatBouton = 0
    	monBouton = msgbox("Appuyer sur ok quand la premiere partie des impressions est terminée",0,"En attente")
     
    	while etatBouton = 0
    		if monBouton = vbOk then 
    			etatBouton = 1
    		end if
    		Wscript.sleep(100)
    	Wend
     
    	Wscript.sleep(1000)
     
    	While oSheel.appActivate("Sage 100 Gestion commerciale pour SQL Server - gecotest.gcm") <> True
     
    		WScript.Sleep 100
    	Wend
     
    	else
    		Wscript.sleep(300)
    		'impression du bon de commande
    		'bouton imprimer	
    			oSheel.SendKeys("+{F5}")   
    			Wscript.sleep(1000)
    			oSheel.SendKeys(NomModele)
    			Wscript.sleep(10000)
    		'OK choix modele
     
     
    		etatBouton = 0
    		monBouton = msgbox("Appuyer sur ok quand le tri est selectionné",0,"En attente")
    		while etatBouton = 0
    			if monBouton = vbOk then 
    				etatBouton = 1
    			end if
     
    			Wscript.sleep(100)
     
    		Wend
     
    		While oSheel.appActivate ("Sage 100 Gestion commerciale pour SQL Server - gecotest.gcm") <> True
    			WScript.Sleep 100
    		Wend
     
    		Wscript.sleep(300)
    		oSheel.SendKeys("{ENTER}")					...
                              ...
    		oSheel.SendKeys("{ENTER}")
     
    		etatBouton = 0
    				Wscript.sleep(300)
    	end if
     
     
    Set oShell = Nothing
     
    END SUB
     
    	SW_SHOWNORMAL=1
     
     
    'impression selon 1e modèle
    	Call Imprim("N:\Imprimés de ...l.bgc",1)
    	Wscript.sleep(300)
    'impression selon 2er modèle
    	Call Imprim("N:\Imprimés de......bgc",2)
    Le probleme vient peut etre de la fonction appactivate que j'utilise mal, bref jai besoin d'aide car la je ne sais plus trop quoi faire...

    Merci d'avance de vos reponses !

  2. #2
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    bonjour,
    le "pilotage" d'application à coup de sendkeys est toujours scabreux
    si le masque du programme sur lequel tu veux intervenir utilise des contrôles standards, il est beaucoup plus efficace d'utiliser un composant comme autoitx voire même d'utiliser directement le langage autoit au lieu du vbs
    voir également du côté de son cousin autohotkey
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 9
    Par défaut
    Merci de ta reponse, il est vrai que le controle par des "sendkey" nest pas terrible. Mais pour l'utilisation que jen fais, cest plutot correct et suffisant. Je suppose que mon probleme de focus n'a rien avoir les sendkeys sinon jaimerai bien comprendre le rapport...

  4. #4
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 127
    Par défaut
    Citation Envoyé par omen999
    le "pilotage" d'application à coup de sendkeys est toujours scabreux


    Peut être une piste ......
    Il est possible d'améliorer légèrement la réaction du programme aux ordres SendKeys , quand c'est le programme VBS qui lance celui que l'on veut piloter.
    En partant de l'exemple de l'aide VBS (Script56.CHM), mais avec quelques modifications.
    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
             dim IdRep, WshShell
     
             set WshShell = WScript.CreateObject("WScript.Shell")
             IdRep = WshShell.Run("calc")
             WScript.Sleep 500 'donner le temps à la fenêtre d'apparaitre
             'WshShell.AppActivate "Calculatrice"
             WshShell.AppActivate IdRep
             'WScript.Sleep 100
             WshShell.SendKeys "1{+}"
             WshShell.AppActivate IdRep
             'WScript.Sleep 500
             WshShell.SendKeys "2"
             WshShell.AppActivate IdRep
             'WScript.Sleep 500
             WshShell.SendKeys "~"
             WshShell.AppActivate IdRep
             'WScript.Sleep 500
             WshShell.SendKeys "*3"
             WshShell.AppActivate IdRep
             'WScript.Sleep 500
             WshShell.SendKeys "~"
             'WScript.Sleep 2500
    WshShell.AppActivate "Calculatrice" donne le focus par le nom de la fenêtre, cela reste aléatoire, IdRep permet de faire référence à la fenêtre de l'exécutable lancé par le script, en passant l'ordre avant chaque SendKey on a beaucoup plus de chance quelle prenne vraiment le focus, de plus on peut très souvent se passer d'attendre hypothétiquement des millisecondes entre chaque SendKey.
    Sous Windows 7 tournant à 2x 1.87 GHz, l'exemple simple sans les AppActivate mais avec les Sleep, cela ne fonctionne pas, par contre avec le code proposé, il n'y a pas de problème.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  5. #5
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    malheureusement la fonction Run ne renvoie pas le process id
    pour t'en convaincre essaye ceci en plaçant la calculatrice derrière une autre application avant de fermer la boite de dialogue
    la calculatrice ne réapparaitra pas (IdRep est égal à 0)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set oShell = WScript.CreateObject("WScript.Shell")
    IdRep = oShell.Run("calc")
    MsgBox "mettre la calculatrice en arrière-plan"
    oShell.AppActivate IdRep
    en revanche, il y a une méthode +robuste qui utilise la propriété ProcessId de l'objet WshScriptExec qui a été "oubliée" dans le fichier doc mais qui existe dans la doc en ligne
    (à ajouter dans la FAQ peut-être)
    un exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set oShell = WScript.CreateObject("WScript.Shell")
    Set oCalc = oShell.Exec("calc")
    MsgBox "mettre la calculatrice en arrière-plan"
    oShell.AppActivate oCalc.ProcessID
    avec cette technique, on peut "piloter" plusieurs instances distinctes d'un même prog youpii
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 9
    Par défaut
    apres quelques rapides tests, cest la fonction appactivate qui pose des problemes. Je vais mettre en pratique ce qu'il vient detre dit et travailler avec l'id.

    Sinon je ne peux pas utiliser la fonction 'run' car mon logiciel (sur lequel s'effectue les actions de mon script) est deja lancé. Le script est lancé par le user depuis le logiciel (on peut lancer des programmes externes depuis celui ci...)

    Je ferai un retour d'infos d'ici peu... En esperant pouvoir y mettre a ce moment la le tag "resolu" !

    Merci a tous les 2 !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 9
    Par défaut
    bonjour tout le monde,

    pour donner un peu suite a mon message, je n'ai pas resolu le probleme. C'est une reponse tardive mais mieux vaut tard que jamais. J'ai passé quelques heures dessus mais je suis toujours coincé, je laisse tomber pour le moment, dautres travaux plus important m'attendent. Je reviendrai peut etre sur ce post le jour ou je my recollerai. Merci tout de meme de vos reponses...

    ++

Discussions similaires

  1. Outlook et perte du focus sur une fenêtre
    Par Abac_Angelique dans le forum API, COM et SDKs
    Réponses: 0
    Dernier message: 16/07/2013, 18h28
  2. Perte de focus sur une fenêtre modale
    Par yonpo dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 07/01/2011, 14h32
  3. JTable perte de Focus sur une Cellule
    Par La_Bande_A_Zozo dans le forum Composants
    Réponses: 1
    Dernier message: 25/07/2007, 17h32
  4. focus quand on revient sur une appli VB
    Par pinot dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 12/01/2007, 09h09
  5. Contrôle de saisie sur une perte de focus d'une JTextfield
    Par comeochris dans le forum Composants
    Réponses: 3
    Dernier message: 03/04/2006, 15h21

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