begin process at 2012 02 15 15:38:32
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Visual Basic 6

 > 

Windows

 > 

API

 > 

Utilisation de DoEvents pour reprendre la main sur une appli VB


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Utilisation de DoEvents pour reprendre la main sur une appli VB

vendredi 27 février 2009 à 12:05:53 | Utilisation de DoEvents pour reprendre la main sur une appli VB

rol64

Salut tout le monde!!
J'ai un petit souci avec une application VB que je suis en train de développer, dont le but est de répéter une séquence de raccourci clavier à une fenêtre précise sous windows. Mon pbm principal est que je perds la main sur mon application VB dès lors qu'une procédure est en cours.....

Le code source de ma procédure associée à un button_click:

************************************************************************

Private Sub Command1_Click()

Dim i As Integer                                        ' index de ma boucle for, nb_repet est le nbre de répétition à effectuer

lres = SetForegroundWindow(handle_wd1)

For i = 1 To nb_repet

    Call keybd_event(VK_F2, 0, 0, 0)

    Call keybd_event(VK_F2, 0, KEYEVENTF_KEYUP, 0)

    Sleep 30000

Next

End Sub

*************************************************************************

La fonction de cette procédure est d'envoyer en boucle l'évènement clavier F2 à la fenêtre d'une application différente (application sous SAP), que j'active en début de procédure avec l'API 'SetForegroundWindow' afin d'automatiser une tâche extrêment simple mais à effectuée beaucoup de fois (entre 5 et 150 fois....).

Sachant qu'à partir du moment où l'appuie sur la touche F2 a été simulé, la tâche exécutée sous l'application prend un temps variable allant de 15 à 25 secondes. Ainsi, que le processus engendré par l'appuie de F2 dure 25 seconde ou moins, il y aura toujours ma temporisation de 30 secondes, ce qui implique une perte de temps....

 

J'ai donc une première question: existe-t-il un témoin quelque part ou une API particulière permettant de m'affranchir de ma temporisation Sleep,  afin de piloter l'incrémentation de mon index i à l'intérieur de ma boucle For avec un indicateur de fin du processus associé à un précédent appuie sur F2?  (J'espère que ce que je raconte est claire et compréhensible...) J'avais pensé au son wue Windows génère quand la tâche est terminée... Je me suis dis que ce son est tracée dans une varibale et que pour que ce sont soit généré à la fin de la tache il doit bien y avoir quelque part une variable indicatrice de fin de processus?!!!

 

Une deuxième question est liée au souhait d'ajouter un bouton pour interrompre ma boucle, j'ai lu qu'il y avait un moyen de redonner la main à Windows avec une certine fonction DoEvents,  cependant je ne suis pas sur d'avoir bien compris son fonctionnement... De ce dont j'en ai compris j'ai modifié mon code de la facon suivante, en utilisant une variable booléenne associée à un évènement command2_click():

 

*************************************************************************

Dim interrupt_ask As Boolean

 

Private Sub Command1_Click()

Dim i As Integer                                      ' index de ma boucle for, nb_repet est le nbre de répétition à effectuer

interrupt_ask = False                                   

For i = 1 To nb_repet

            DoEvents                        'donner la main à windows pour permettre la gestion de l'appuie sur bouton interrompre

            If interrupt_ask = True Then      ' qui est associé à la procédure Command2_Click()

                        interrupt_ask = False   ' si l'évènement interrompre à eu lieu on réinitialise la variable booléènne et on sort

                        Exit For                                  ' de la boucle For'

            EndIf

            lres = SetForegroundWindow(handle_wd1)  'donne le focus sur la fenêtre de l'appli SAP pour lui envoyer les evts clavier

    Call keybd_event(VK_F2, 0, 0, 0)

    Call keybd_event(VK_F2, 0, KEYEVENTF_KEYUP, 0)

    Sleep 30000                     ' attendre 30 seconde pour être sur que la tâche associée au F2 généré précédemment est bien terminée

Next

End Sub

 

Private Sub Command2_Click()

            interrupt_ask = True

EndSub

**************************************************************************

 Cependant, ca ne marche pas, à partir du moment ou je lance la boucle je perds complètement la main jusqu'à la fin de la boucle. L'icône de la souris est constamment doublé du petit sablier lorsque je plcae mon curseur sur l'application "Séquence_clavier" et si je tente de cliquer sur le bouton interrompre le message  "(ne répond pas)" vient s'accoler à côté de du nom de mon application dans la barre de titre.... Je suis donc obligé de terminé le processus en passant par le gestionnaire de tache CTRL+MAJ+ECHAP et de faire Applications>Fin de Tache pour sortir du programme.... Pas très classe ni très pro me direz vous...

 

Je voudrais joindre a feuille VB6 afin que vous puissiez faire le test vous même... Mais je ne sais pas ou est ce que l'on peut attacher un fichier sous ce forum... Pouvez vous m'aider? Après vous pourrez faire le test comme suis :Pour faire le test ave l'application calculatrice de Windows, vous devez lancer la calculatrice, récupérer le hWnd de la calculatrice à l'aide du bouton "Voir les fenêtres", renseigner le champs ID Wnd treated, donner le nombre de répétition de l'appuie de la touche F10 (ici je tavail avec F10 plutot qu'avec F2, car F2 n'a pas d'effet sous la calculatrice. En revanche F10 surligne/désurligne en bleu l'onglet "Edition" du menu de la calculatrice...). J'ai aussi modifié la durée du sleep pour accélerer la boucle et voir les effets à une échelle  de temps d'attente plus acceptable dans le cadre d'une procédure de débuggage...

 

J'ai une certine intuition quand à l'origine du bloquage mais je n'en suis pas certain... Pour moi il ya a une histoire de changement de handle perturbé/non gérer par mon application: en effet lorsque je clique (enfin plutot lorsque que je veux cliquer sur le bouton interrompre, cela implique que le l'envoi des séquences F2 s'applique à mon application et non plus à la fenêtre que je désire... Et j'arrive donc à ma troisième question: est il possible verrouiller un handle sur une fenêtre précise afin que la séquence clavier s'applique à une fenêtre spécifique, que je clique ou non sur une autre fenêtre, et donc que je fasse passer ma fenêtre en second plan...

 

vendredi 27 février 2009 à 12:18:09 | Re : Utilisation de DoEvents pour reprendre la main sur une appli VB

Renfield

Administrateur CodeS-SourceS
Sleep bloque ton appli.
donc faut cliquer au bon moment, pour que ca soit pris en compte ^^

fais un plus petite pause, mémorise le résultat de l'API GetTickCount
après avoir fait ton envoi de touche
ensuite, tu boucle tans qu'un certain temps n'est pas passé (GetTickCount - nStartTime > 30 ) ...
lundi 2 mars 2009 à 11:26:50 | Re : Utilisation de DoEvents pour reprendre la main sur une appli VB

rol64

SAlut,
Merci pour ta réponse Renfield! Je pense que je vais abandonner la solution sleep qui est très simpliste au début mais qui me complique pas mal la tâche... Je cherche donc une autre solution qu'une temporisationqui me fait perdre du temps car l'évènement généré par F2 dure un temps variable lors que ma temporisation est fixée sur une variable précise... Je cherche donc à trouver un moyen de remplacer le sleep par une variable témoin de la fin de l'évènement généré par le F2 précédent... Sais tu s'il existe une api permettant d'être averti lors de la fermeture d'une fenêtre? J'avais pensé au son généré par windows lorsque la tâche est terminé....
A+

lundi 2 mars 2009 à 16:57:57 | Re : Utilisation de DoEvents pour reprendre la main sur une appli VB

aserf

Salut,

Est ce que tu na ps moyen de voir le handel de la fenetre ou sont nom, et de boucler sur l'ensemble des fenetre pour voir si elle existe, si elle n'es plus la ... le traitement est terminer,

a++
seb


Développement Rapide PHP / VBNET -> www.database2code.com

lundi 2 mars 2009 à 18:07:05 | Re : Utilisation de DoEvents pour reprendre la main sur une appli VB

rol64

Carrément!!!!!!!!! J'y avais vraiment pas pensé!!!!! Merci aserf!!!! J'essaye cela ce soir et je te tiens au courant!!!!
mardi 3 mars 2009 à 17:41:32 | Re : Utilisation de DoEvents pour reprendre la main sur une appli VB

rol64

Salut Aserf,

J'ai creusé du côté de ta proposition qui est vraiment astucieuse cependant je me vois dans l'impossibilité de la mettre en oeuvre vu que la fenêtre en question ne se ferme pas à la fin de la tâche.
 
En revanche j'ai constaté qu'il y a un message qui apparait à la fin de la tâche en bas de la fenêtre principale de l'application, dont le contenu est différent à chaque fois (car en rapport avec l'objet traité par la tâche). Le message apparait en bas de la fenêtre, dans une zone que j'appelerai la barre de dialogue. Je voudrais savoir si il existe une quelconque API windows me permettant de récupérer ce message dans une variable, sachant que je dispose du handle de cette fenêtre??? J'avais pensé à GetWindowText mais il semble que je ne peux récupérer que "le titre d'une fenêtre, d'un contrôle ou d'une zone de saisie".

Merci pour ton aide! Je continue à creuser de mon côté...
A+
roland
mercredi 4 mars 2009 à 09:51:34 | Re : Utilisation de DoEvents pour reprendre la main sur une appli VB

rol64

Bon, ca avnce plutôt bien!!! si ca vous intéresse j'ai trouvé des infos sur cette adresse [ Lien ]


C'est un tutoriel sur le subclassing (ou sous classement) pour intercepter les messages windows. Il est vraiment bien fait, en plus en VB... Donc que du bonheur.... Je pense que je suis pas loin de trouver la solution!!! Il semble que l'info de fin de tâche qui s'affiche dans la barre d'état de ma fenêtre SAP est bien récupérable!!!!
Merci encore!!!
A+

mercredi 4 mars 2009 à 09:55:25 | Re : Utilisation de DoEvents pour reprendre la main sur une appli VB

Renfield

Administrateur CodeS-SourceS
piste: http://www.vbfrance.com/codes/EXTRAIRE-TEXTE-FENETRES-APPLICATIONS-TIERCES-LISTBOX-LISTVIEW-TEXTBOXES_46390.aspx


Cette discussion est classée dans : boucle, application, fenêtre, for, f2


Répondre à ce message

Sujets en rapport avec ce message

Boucle For ... Ne Repond pas ! [ par scottmat ] Bonjours à tous, <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" Pb Déclaration Variable dans boucle For [ par elisenda21 ] Bonjour,voilà mon pb. J'ai défini un type de variable de la manière suivante :Type Nouv_Type    Données1 As String    Données2 As Byte    Données3 As Probleme avec For each en VB6 [ par MIKYMAXSP28 ] Bonsoir a tous,Je souhaite utiliser une boucle For Each pour récupèrer le nom de chaque control de mon formulaire.Mon problème est que ma boucle For E CheckBox dans une boucle for [ par dimitriusai ] Bonsoir,ma question est la suivante.Comment faire pour créer un certains nombre de checkbox ?Par exemple:for i as integer = 1 to 4   checkboxi.checked creer une formule [ par inge68 ] Bonjour, debutant en VBA, Je voudrais creer une formule qui contient une autre formule et une boucle for.ce que je veux faire est en gros :(i est le n Boucle à faible ressource mémoire ? [ par aluccard ] bonjour,j'ai une application VB.net qui se met en attente de fermeture d'une fenêtre msDOS.J'avais fait une boucle de ce typeDo           ProcessMSDOS Problème de boucle : passer à un 2eme formulaire et revenir finir la boucle [ par TrafMaxime ] Salut à tous et merci à ceux qui auront des idées voilà mon problème :Je fais une boucle qui donne un n° spécial à chaque éléments itérés, on finalise boucle For question toute simple [ par front33 ] Bonjour,une question toute simple,a t on le droit de faire une boucle For comme ci dessous si on souhait tester que certaines valeurs?For i = 1, 8, 98


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,484 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales