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

Langage Delphi Discussion :

vérifier qu'un shellexecute est terminé


Sujet :

Langage Delphi

  1. #1
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut vérifier qu'un shellexecute est terminé
    Bonjour

    Depuis mon appli, je lance le navigateur internet et charge une page avec un ShellExecute
    Du code s'exécute ensuite une fois la page chargée

    Le chargement pouvant prendre un certain temps, comment je peux savoir si le chargement de la page est terminé ?
    Choisir, c'est renoncer...

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 824
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 824
    Points : 15 249
    Points
    15 249
    Par défaut
    Yop !
    Citation Envoyé par OutOfRange Voir le message
    Le chargement pouvant prendre un certain temps, comment je peux savoir si le chargement de la page est terminé ?
    En utilisant la fonction "Rechercher", comm' d'hab... Y a ça, qui date d'avant-hier...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Salut Jipété

    Le lien que tu me proposes concerne le point de savoir si le programme appelé par Shellexecute est fermé
    Ce n'est pas ma question... relis là

    Merci pour ta réactivité
    Choisir, c'est renoncer...

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 330
    Points
    11 330
    Billets dans le blog
    6
    Par défaut
    Il me semble possible, sinon probable, qu'on ne puisse le savoir en passant par ShellExecute.

    Pour un WebBrowser, on a un événement, mais pour un programme externe...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Citation Envoyé par OutOfRange Voir le message
    Le lien que tu me proposes concerne le point de savoir si le programme appelé par Shellexecute est fermé. Ce n'est pas ma question...
    Relis la réponse
    Il est fait mention de ShellExecuteEx et le paramètre qui peut t'être utile est SEE_MASK_WAITFORINPUTIDLE.

    Mais avec IE par exemple, ça ne fonctionnera que si tu forces l'ouverture d'un nouveau navigateur. S'il est configuré pour ouvrir un nouvel onglet dans l'instance existante, ShellExecuteEx retourne immédiatement.

    SEE_MASK_WAITFORINPUTIDLE est basé sur l'API WaitForInputIdle. Tu peux aussi imaginer retrouver les nouveaux processus après l'appel et te synchroniser sur chacun d'eux...

  6. #6
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut mea culpa
    Oups !
    Je n'avais pas été assez loin dans la lecture du sous-lien

    Je me suis finalement inspiré de la solution de nicolassalocin
    Mais je bloque...

    Lorsque je passe SEE_MASK_WAITFORINPUTIDLE en paramètre à la propriété fmask du TShellExecuteInfo, j'ai une belle erreur à la compilation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        vSEInfo.fMask        := SEE_MASK_WAITFORINPUTIDLE;
    [Erreur] pal1.pas(720): Identificateur non déclaré : 'SEE_MASK_WAITFORINPUTIDLE'
    L'est tard, verrai ça d'main

    Merci Andnotor et sans rancune Jipété
    Choisir, c'est renoncer...

  7. #7
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Bonjour

    Encore une fois est ton ami... Le temps de taper "Delphi SEE_MASK_WAITFORINPUTIDLE" et la solution se trouve dans le premier lien.
    Il ne reste plus qu'à déclarer la constante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SEE_MASK_WAITFORINPUTIDLE:=$2000000
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  8. #8
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Bonsoir DOLPat®

    Je pensais que SEE_MASK_WAITFORINPUTIDLE correspondait à une valeur prédéfinie (sans doute l'heure tardive )

    J'ai fait quelques modifs mais ça ne fonctionne pas

    Voici ce que je veux faire
    Lancer IE et ouvrir une page internet (par ex la faq delphi)
    attendre qu'elle soit complètement chargée
    Puis le programme continue son exécution (par ex la simulation d'une séquence de frappes au clavier)

    Voici le code, qui fonctionne...
    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
    procedure Tpal.OuvrirLien(index:integer);
     
      function ShellExecuteAndWait(vHandle     : HWND;
                                   vOperation  : string;
                                   vFichier    : string;
                                   vParametres : string;
                                   vRepertoire : string;
                                   vAffichage  : Integer;
                                   vDuree      : DWORD) : Cardinal;
      var
        vSEInfo   : TShellExecuteInfo;
     
      begin
        //Initialisation de la structure ShellExecuteInfo
        ZeroMemory(@vSEInfo, SizeOf(vSEInfo));
     
        //Remplissage de la structure ShellExecuteInfo
        vSEInfo.cbSize       := SizeOf(vSEInfo);
        vSEInfo.fMask        := $2000040;
        vSEInfo.Wnd          := vHandle;
        vSEInfo.lpVerb       := PAnsiChar(vOperation);
        vSEInfo.lpFile       := PAnsiChar(vFichier);
        vSEInfo.lpParameters := PAnsiChar(vParametres);
        vSEInfo.lpDirectory  := PAnsiChar(vRepertoire);
        vSEInfo.nShow        := vAffichage;
     
        //Execution
        if ShellExecuteEx(@vSEInfo)
        then //ShellExecuteEx OK : attendre la fin du process
          Result := WaitForInputIdle(vSEInfo.hProcess, vDuree)
        else //ShellExecuteEx KO : renvoyer l'erreur
          Result := GetLastError();
      end;
     
    var
      c:integer;
    begin
      if ShellExecuteAndWait(Application.Handle,
                             'open',
                             '"C:\Program Files\Internet Explorer\IEXPLORE.EXE"',
                             'http://delphi.developpez.com/faq/?page=rechercher',
                             '',
                             SW_SHOWNORMAL,
                             INFINITE)
         =0
      then begin
             sleep(3000);
             keybd_event(72,0,1,0);
             keybd_event(65,0,1,0);
             keybd_event(78,0,1,0);
             keybd_event(68,0,1,0);
             keybd_event(76,0,1,0);
             keybd_event(69,0,1,0);
           end;
    end;
    ... sauf que si j'enlève le sleep (sans mauvais jeu de mots ), les simulations de frappes ne se font pas, comme si le programme n'avait pas attendu
    Pourtant l'attente se déroule normalement vu que WaitForInputIdle renvoie zéro (le code à partir de la ligne 47 est bien exécuté si on garde le sleep )

    Remarque :
    vSEInfo.fMask doit être égal à $2000040 et non $2000000 pour que hProcess récupère le handle de fenêtre utilisé ligne 30


    Ah cette maudite API... mon cauchemar
    Et ces pages d'aide en anglais
    Choisir, c'est renoncer...

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Citation Envoyé par OutOfRange Voir le message
    keybd_event(72,0,1,0);
    Il faudrait déjà presser la touche avant de la relâcher

    Soit tu utilise le flag SEE_MASK_WAITFORINPUTIDLE ($2000000) et tu n'as pas besoin de WaitForInputIdle, soit tu passes par cette fonction et tu as besoin du flag SEE_MASK_NOCLOSEPROCESS ($40)

    Mais bon, il est toujours compliquer de se synchroniser sur un autre processus, surtout si celui-ci en engendre d'autres...

  10. #10
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Il faudrait déjà presser la touche avant de la relâcher
    Certes !
    Et pourtant ça marche comme ça

    Merci pour les précisions
    Choisir, c'est renoncer...

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Citation Envoyé par OutOfRange Voir le message
    Certes !
    Et pourtant ça marche comme ça
    Ça "marche" comme ça parce que certaines applications ne respectent pas les standards et ne réagissent qu'aux touches relâchées.
    Perso, je ne m'y fierais pas et enverrais les informations dans l'ordre logique sans me soucier de l'application cible.

  12. #12
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Si tu avais effectué une gestion des erreurs, tu aurais pu constater que ta fonction ne fonctionne pas. Elle renvoie toujours WAIT_FAILED sans attendre quoi que ce soit. (tout du moins chez moi, avec Firefox car je ne possède pas IE)

    Voici le code avec la gestion des erreurs (pondu rapidement):
    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
    procedure TForm12.Button1Click(Sender: TObject);
     
      function ShellExecuteAndWait(vHandle     : HWND;
                                   vOperation  : string;
                                   vFichier    : string;
                                   vParametres : string;
                                   vRepertoire : string;
                                   vAffichage  : Integer;
                                   vDuree      : DWORD) : string;
      var
        vSEInfo   : TShellExecuteInfo;
     
      begin
        //Initialisation de la structure ShellExecuteInfo
        ZeroMemory(@vSEInfo, SizeOf(vSEInfo));
     
        //Remplissage de la structure ShellExecuteInfo
        vSEInfo.cbSize       := SizeOf(vSEInfo);
        vSEInfo.fMask        := $2000000;
        vSEInfo.Wnd          := vHandle;
        vSEInfo.lpVerb       := PAnsiChar(vOperation);
        vSEInfo.lpFile       := PAnsiChar(vFichier);
        vSEInfo.lpParameters := PAnsiChar(vParametres);
        vSEInfo.lpDirectory  := PAnsiChar(vRepertoire);
        vSEInfo.nShow        := vAffichage;
     
        //Execution
        if ShellExecuteEx(@vSEInfo)
        then //ShellExecuteEx OK : attendre la fin du process
          begin
            Application.ProcessMessages;
            Sleep(10);
            case WaitForInputIdle(vSEInfo.hProcess, vDuree) of
              0:            Result:='';
              WAIT_FAILED:  Result:= '[WAIT_FAILED] l''attente a échouée...';
              WAIT_TIMEOUT: Result:= '[WAIT_TIME_OUT] Dépassement de temps...';
            end;
          end
        else //ShellExecuteEx KO : renvoyer l'erreur
          Result := 'Erreur ShellExecute: ' + IntToStr(GetLastError());
      end;
    var
      msgErr:     string;
    begin
      msgErr:=ShellExecuteAndWait(Application.Handle,
                             'open',
                             '"C:\Program Files (x86)\Mozilla Firefox\FireFox.EXE"',
                             'http://delphi.developpez.com/faq/?page=rechercher',
                             '',
                             SW_SHOWNORMAL,
                             INFINITE);
      if msgErr='' then
        begin
          Showmessage('Réussite !!!');
          sleep(3000);
          keybd_event(72,0,1,0);
          keybd_event(65,0,1,0);
          keybd_event(78,0,1,0);
          keybd_event(68,0,1,0);
          keybd_event(76,0,1,0);
          keybd_event(69,0,1,0);
        end
      else
        MessageBox(0, PChar(msgErr), 'Erreur', MB_ICONERROR);
    end;
    [Edit] même si cela ne solutionne pas le problème, il faut noter que vDuree n'est pas définie...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      WaitForInputIdle(vSEInfo.hProcess, vDuree)    // Temps d'attente indéfini...
    Il convient donc de remplacer la ligne par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      WaitForInputIdle(vSEInfo.hProcess, 10000)    // Temps d'attente = 10 secondes
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  13. #13
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Ça "marche" comme ça parce que certaines applications ne respectent pas les standards et ne réagissent qu'aux touches relâchées.
    Perso, je ne m'y fierais pas et enverrais les informations dans l'ordre logique sans me soucier de l'application cible.
    C'est fait
    Choisir, c'est renoncer...

  14. #14
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Citation Envoyé par DOLPat® Voir le message
    Si tu avais effectué une gestion des erreurs, tu aurais pu constater que ta fonction ne fonctionne pas. Elle renvoie toujours WAIT_FAILED sans attendre quoi que ce soit.
    OK pour la gestion des erreurs

    J'ai testé ton code chez moi et j'ai bien un message 'Réussite !!!', à condition d'initialiser vSEInfo.fMask comme ceci
    Si j'ai bien compris, cela permet de récupérer le handle de fenêtre à attendre
    hProcess

    Type: HANDLE

    A handle to the newly started application. This member is set on return and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL.
    Mais même dans ce cas, l'attente ne semble pas se faire en réalité
    Le message 'Réussite !!!' s'affiche AVANT que la page soit entièrement chargée
    A mon avis dès que le lancement de l'appli [IEEXPLORER.EXE] est terminé
    Car j'ai le message même si le PC n'est pas connecté...

    Merci pour ton aide
    Choisir, c'est renoncer...

  15. #15
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    As-tu essayé d'ajouter le flag SEE_MASK_NOASYNC ?

  16. #16
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    en recherchant, j'ai trouvé qu'en VBA on pouvait utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //loop until the page finishes loading
     Do While appIE.BusyLoop
    C'est quand même dément qu'avec Delphi, il n'y a pas une fonction simple pour arriver au même résultat...
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  17. #17
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Citation Envoyé par DOLPat® Voir le message
    C'est quand même dément qu'avec Delphi, il n'y a pas une fonction simple pour arriver au même résultat...
    Et pourquoi ne pourrais-tu pas faire la même chose en Delphi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      appIE :variant;
     
    appIE := CreateOleObject('InternetExplorer.Application');
    while AppIE.Busy do;

  18. #18
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Ben je ne connaissais pas...
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

Discussions similaires

  1. vérifier que la compression est terminée
    Par azopei dans le forum VBScript
    Réponses: 6
    Dernier message: 01/12/2008, 17h08
  2. Comment savoir si un Shell est terminé ?
    Par Mr Capone dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 21/02/2005, 17h05
  3. Réponses: 6
    Dernier message: 06/12/2004, 22h18
  4. Vérifier si une form est ouverte
    Par nivet dans le forum Langage
    Réponses: 6
    Dernier message: 23/11/2004, 09h17
  5. [Image] détecter que le chargement est terminé
    Par Pascmar dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 19/07/2004, 19h12

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