Lancement d'un process mais le process appelant garde le focus dans certains cas

aciclb Messages postés 12 Date d'inscription lundi 18 octobre 2004 Statut Membre Dernière intervention 18 avril 2012 - 28 avril 2007 à 18:58
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 28 avril 2007 à 19:32
Au secours ...! je m'arrache les quelques cheveux qu'il me reste.


J'ai développé une application avec un menu EXE qui appelle d'autres programme EXE. Les options du menu sont des boutons que l'utilisateur peut cliquer ou appeler par le clavier avec les touches de 1 à 9.
C'est l'utilisation du clavier qui pose problème. Si l'utilisateur appuie sur le 1, pas de pb. Le programme EXE 1 s'execute bien et prend le focus, le menu EXE est en tache de fond derriere.
Si l'utilisateur appuie 2 fois sur la touche 1 ou sur la touche 1 puis entrée, le programme EXE 1 s'execute bien et s'affiche à l'écran mais c'est le menu EXE qui garde le focus derriere. Les programmes sont affichés en plein écran.
J'ai compris que c'était un pb d'evenement.


Descrition du code.
Le menu EXE utilise Form_KeyDown
si KeyCode = vbkey1 alors Appel de la fonction de lancement du programme




Fonction de lancement du programme
Public Sub ExecuterProgramme(Commande As String, Optional sArgument As String = "")


    Dim proc As PROCESS_INFORMATION
    Dim Start As STARTUPINFO
    Dim ret As Long
   
    On Error GoTo errortag
   
    proc.hProcess = -1
    proc.hThread = -1
   
    frmMenu.ChargementEnCours.Visible = True
    frmMenu.ChargementEnCours.Refresh


    'Lancement de la commande
    'StartupInfo pour le processus qui lancera la commande
    Start.cb = Len(Start)
    'Lancement de la commande
    ret& = CreateProcess(0&, Trim(Commande & " " & sArgument), 0&, 0&, 0&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, proc)
    If ret = 0 Then
        Err.Raise Err.LastDllError, "LancerProcess", "Erreur systeme N° " & Err.LastDllError
        'MsgBoxTPV Err.Description, vbExclamation, sExe
    End If
  
    ' Initialisation du process
    Call WaitForInputIdle(proc.hProcess, INFINITE)
    ' Suppression du thread handle qui ne sert à rien
    Call CloseHandle(proc.hThread)


    Do
        ret = WaitForSingleObject(proc.hProcess, 0)


        ' Si plus de timeout, le process est terminé
        If ret <> WAIT_TIMEOUT Then Exit Do


        'Le process n'est pas fini, on peut faire autre chose
        DoEvents


    Loop While True


    ' Suppression du process
    Call CloseHandle(proc.hProcess)
    Call CloseHandle(proc.hThread)
   
    frmMenu.ChargementEnCours.Visible = False
    frmMenu.ChargementEnCours.Refresh
 
    Exit Sub
      
errortag:
    If proc.hProcess <> -1 Then CloseHandle proc.hProcess
    If proc.hThread <> -1 Then CloseHandle proc.hThread
    MsgBoxTPV Err.Number & " - " & Err.Description, vbExclamation, Commande & " " & sArgument


End Sub




Le DoEvents ne change rien au problème.
En fait, si l'utilisateur appuie sur plusieurs touche, le menu EXE execute toujours les evenements tans que le programme EXE n'est pas encore chargé, je pense que c'est une histoire de threed ou process. Il faudrait pouvoir, des la premiere touche , bloquer tous les evenements du menu EXE mais la je ne sais pas comment faire.
 
Merci , celui qui me donne la soluce ou la piste est un dieu de l'informatique, c'est sur ...!


AU SECOURS ....





<sup>
Dominique R.
</sup>

1 réponse

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
28 avril 2007 à 19:32
Tu peux essayer de mettre en place un filtre lorsque tu es déjà en cours de traitement d'une commande :

Private Sub Form_KeyPress(KeyAscii As Integer)
Static TraitementEnCours As Boolean

If TraitementEnCours Then
   Exit Sub
Else
   'Debut du traitement, interdiction d'autres touches
   TraitementEnCours = True
   
   
   
   
   ' Traitement de la touche, Appel des différents exe
   ' Mettre ici ton code d'appel
   
   
   
   
   'Fin du traitement, autorisation des touches
   TraitementEnCours = False
End If

End Sub
 , ----
[code.aspx?ID=41455 By Renfield]
---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #</italique>
0
Rejoignez-nous