none
Tester programme lancé : problème avec API FindWindow ? RRS feed

  • Question

  • Bonjour,

    Je n'arrive pas à tester si un programme est déjà lancé afin de ne pas le lancer deux fois (programme exe externe), mon code :

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
      (ByVal lpClassName As String, ByVal lpWindowName As String) As Int32
    '
    Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click
      Dim rep
      Select Case Mid(sender.name, 7, 1)
       Case "1" : If FindWindow("Tarot4", "Tarot4.exe") = 0 Then rep = Shell("Tarot4.exe ", 1)
       Case "2"
       Case "3"
       Case "4"
       Case "5"
      End Select
    End Sub
    '
    

    Alors le problèe est ici :

    If

     

    FindWindow("Tarot4", "Tarot4.exe") = 0 Then rep = Shell("Tarot4.exe ", 1)

    Le Shelle (isolé) lance bien le programme...

    Mon programme se nomme Tarot4.exe, et il faut renseigner les deux chaînes (je présume) : ipClasse et ipWindowName, certes, mais je peux avoir ces renseignement comment ?

    Nota bene, pour NotePad par exemple, ça marche car on sait ce qu'il faut écrire, mais là, je ne sais pas...

    Est-ce qu'avec le gestionnaire de tâche, en regardant on peut faire quelque chose (en onglet processus / nom de l'image et description j'ai "Tarot4.exe" et en onglet  application j'ai "TAROT", est-ce que ça peut servir ?

    Merci.



    Si ma réponse est utile cliquer en haut à gauche sur le triangle vert.
    Et
    Si la question est résolue, cliquer en bas sur : "Proposer comme réponse"


    Cordialement

    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    lundi 10 janvier 2011 10:31

Réponses

Toutes les réponses

  • Bonjour,

    Essaye de remplacer le FindWindow par un Process.GetProcessesByName("Tarot4").

    Cordialement,


    Kind regards, Sebastien G. - Axiomtek Deutschland GmbH
    lundi 10 janvier 2011 11:27
  • Bonjour et merci,

    En fait, par la ligne de commande que tu proposes je n'ai rien dans le textbox (enfin, crochets vides), alors qu'en listant tout je le trouve dans la liste, voici le code

      Dim p As Process() = Process.GetProcessesByName("Tarot4")
      TextBox1.Text = p.ToString
      '
      Dim processus As Process() = Process.GetProcesses()
      Dim base As String
      Dim tasse As String
      Dim longueur As Integer
      Dim coupe As String
      Dim resultat As String
      Dim lepoint As Integer
      Dim lesProcessus
      For Each lesProcessus In processus ' 29 = "System.Diagnostics.Process ("
       base = lesProcessus.ToString
       tasse = Trim(base)
       longueur = Len(tasse)
       coupe = Mid(tasse, 29, longueur - 29)
       resultat = coupe
       lepoint = InStr(1, resultat, ".", 1) ' enlever le "." et après
       If lepoint <> 0 Then resultat = Mid(coupe, 1, lepoint - 1)
       ListBox1.Items.Add(resultat)
      Next lesProcessus
    
    

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    lundi 10 janvier 2011 13:39
  • GetProcessesByName retourne un tableau de Process, tout comme GetProcesses()

    Tu peux te contenter de tester (p.Length>0), cela va marcher....

     


    Kind regards, Sebastien G. - Axiomtek Deutschland GmbH
    lundi 10 janvier 2011 13:55
  • Bonjour,

    Dans la propriété du projet dans "Application " dans la partie "Propriété de l’infrastructure d'application Windows " coché la case "Application à instance unique "

     

    A bientot


    Cordialement, Troxsa
    lundi 10 janvier 2011 14:13
    Auteur de réponse
  • Bonjour Troxsa,

    Je ne connaissais pas cette option, très sympa du reste, ça évite de jouer avec un mutex ou autre evenement système. Par contre la demande de Joseph porte sur le contrôle d'une application depuis "un lanceur" et non l'application elle-même.


    Kind regards, Sebastien G. - Axiomtek Deutschland GmbH
    lundi 10 janvier 2011 14:19
  • Bonjour,

    Non ... non ... je parle du lancement d'un programme EXRERNE.exe

    Cordialement.

     

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Marqué comme réponse EhJoe lundi 10 janvier 2011 14:44
    lundi 10 janvier 2011 14:37
  • Donc as-tu essayé avec :

     Dim p As Process() = Process.GetProcessesByName("Tarot4")
    if p.Length>0
    ....

    ?

    -édition- en fait il vaut mieux que tu tests p.Length=0 alors -> tu lances l'exe


    Kind regards, Sebastien G. - Axiomtek Deutschland GmbH
    lundi 10 janvier 2011 14:40
  • Bonjour Sébastien,

    Ben non, je vais faire avec ma boucle alors, car j'aime bien voir les noms.

    Un tableau de process, ou pourrait couper aussi avec split, mais sur quel élément baser la coupe, hé ...

    En plus il raconte sa vie quand il liste, tu as vu tout le nettoyage que je dois faire afin d'avoir le nom tout seul, s'il y avait une fonction qui retourne juste son nom, ah ...

    Bon, ben merci, cordialement.

     

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    lundi 10 janvier 2011 14:43
  • Fais tout de même un GetProcessByName alors, car ça va te filtrer ton résultat en fonction du paramètre (dans l'exemple Tarot4). Du coup ta boucle sera un poil plus rapide, mais tu peux la conserver.

    Kind regards, Sebastien G. - Axiomtek Deutschland GmbH
    lundi 10 janvier 2011 14:47
  • J'peux pas Sébastien, si on rajoute byBame("") faut un nom, et si je fais une boucle avec tous en donnant un nom a byName je n'en vois pas trop le sens, la boucle dure un 10e de seconde ... d'autant que ça ne change rien au résultat, il me raconte toujours sa vie, dans tous les cas il faut faire de la manupulation de châine ensuite, soit en recherche, soit en nettoyage (sauf s'il y avait une fonction prévue pour nettoyer ?), voici un exemple de ce qu'il pond :

    System.Diagnostics.Process (InputPersonalization)

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    lundi 10 janvier 2011 15:12
  • Il faut mieux vérifier le nom interne de l'application en question, l'application pourra changé de nom mais pas le nom interne

    le nom interne ce trouve dans la propriété de l'exe, onglet details, et Original fifleName


    Cordialement, Troxsa
    lundi 10 janvier 2011 15:46
    Auteur de réponse