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...