Process.kill() ne marche pas

Résolu
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012 - 27 mars 2007 à 01:35
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012 - 28 mars 2007 à 20:29
Salut,
Je suis en train de développer un programme qui démarre une application avec le chemin du exe et son nom.
Pour démarrer l'application :
process = Diagnostics.Process.Start(VarProg), "-w -ns")

l'application démarre parfaitement

Le problème survient lorsque j'essaie de fermer l'application
Pour arreter  :
process.Kill()

Ca me sort cette erreur :
Cannot process request because the process has exited.

L'application reste ouverte...

Avez-vous une solution ?
Merci

-Jn-

12 réponses

jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012
28 mars 2007 à 20:29
bon j'ai trouvé...solution :

pour fermer :
        For Each r As Process In Process.GetProcessesByName(nomApplication)
            r.kill()
        Next

le handle :
        For Each r As Process In Process.GetProcessesByName(nomApplication)
            hdl = CLng(r.MainWindowHandle)
        Next

-Jn-
3
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
27 mars 2007 à 08:07
Salut,


Je peux te trouver une solution, mais il me faut quelques infos. Sur
quel langage, tu programmes (VB6, VBA, VB.NET) ? et quel est le nom du
processus de ton application que tu veux lancer ?


@+
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
27 mars 2007 à 08:17
Salut, voilà mais attention à son utilisation car cela Kill tous les processus de l'application choisie:http://www.codyx.org/snippet_fermer-processus-cours-supprimer-memoire_261.aspx

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 mars 2007 à 08:27
fauve, ouvre les yeux, tout est là...
Thèmes / VB.NET et VB 2005

jnbrunet, tout dépend de ce que tu lance. Par exemple si tu lance un programme qui en lance un autre...
ta variable 'process' sera liée au premier programme, qui terminera assez tôt, laissant la place au deuxième, qui sera lui affiché.
a voir si dans ton cas c'est plausible.

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
27 mars 2007 à 11:29
Oui, je sais que je suis dans VB.NET et VB 2005 mais il n'y en a encore qui arrive à se tromper. La dernière fois, j'ai aidé quelqu'un sur un problème de remplacer un texte par un autre dans une textbox donc vu qu'il était dans VB.NET et VB 2005 et je lui sorti un code en VB.NET mais il ne programmait en VB.NET mais en VB6.

Vu que ca m'est arrivé plusieurs fois, je poses la question.

@+
0
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012
27 mars 2007 à 13:38
En effet, j'utilise bien vb 2005. Pour mon problème, j'avais déjà essayé le for each, malheureusement ça ne marche pas. J'arrive pourtant à trouver son handle en utilisant l'api FindWindow et le titre de l'application. En utilisant l'api SendMessage de vb6, le programme se ferme bien. Le problème est que je ne sais pas quoi faire avec la variable lParam As Any du parmètre de SendMessage. VB 2005 de reconnait pas un type As Any. Y a-t'il quelque chose que je pourrais faire avec le handle ? Ou bien en changeans le type de paramètre du SendMessage ?

-Jn-
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
27 mars 2007 à 13:45
Effectivement en VB.Net le type any n'existe pas, c'est à toi de le définir, ici un exemple avec sendmessage:



Private



Declare



Function
SendMessage

Lib



"user32"



Alias



"SendMessageA"
(

ByVal
hwnd

As



Integer
, _


ByVal
wMsg

As



Integer
,

ByVal
wParam

As



Integer
,

ByVal
lParam

As



Object
)

As



Integer
SendMessage(hwnd, WM_LBUTTONDOWN, 0, 0)

SendMessage(hwn1, WM_LBUTTONUP, 0, 0)





















 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 mars 2007 à 14:28
mets Byval, As Integer et colle lui un 0 ca ira bien la plupart du temps

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012
28 mars 2007 à 03:38
salut, avec le sendMessage, ca me sort cette erreur :
SendMessage' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

voici mon code(simplifié) :
Déclaration du module déclaration :
    Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Object) As Long 'lParam As integer ne marche pas plus
    Public Const WM_CLOSE As Integer = &H10
    Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Procédure :
    Private Sub stopP()
        Try
            hdl = FindWindow(vbNullString, "Titre")
            If hdl > 0 Then
                SendMessage(hdl, WM_CLOSE, 0, 0)
                Throw New ApplicationException("Fermeture du jeu ...")
            Else
                Throw New ApplicationException("Handle du jeu non trouvé")
            End If

        Catch ex As Exception
            txtLog.Text += vbCrLf & ex.Message
        End Try
    End Sub

-Jn-
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
28 mars 2007 à 08:07
Le handle est valide?

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012
28 mars 2007 à 17:25
Salut,
J'ai finalement réussit à trouver le process avec un for each !
Code :
                For Each r As Process In Process.GetProcessesByName(nomApplication)
                    r.Kill()
                Next

Une chose que je ne comprends pas, c'est que lorsque j'utilise le handle du r (ma variable process), ca me donne pas le meme handle que par l'api FindWindow. Ensuite, à chaque fois que j'utilise un api du style SendMessage ou bien SetWindowPos, cela me produit toujours un bog :

has unbalanced the stack. This is likely because
the managed PInvoke signature does not match the unmanaged target
signature. Check that the calling convention and parameters of the
PInvoke signature match the target unmanaged signature.

Quelqu'un aurait une solution ?

-Jn-
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 mars 2007 à 19:27
If hdl > 0 Then

?

hdl est de type non signé ?

FindWindow ne trouve que les fenetre de premier niveau (voir arborescence dans Spy++)

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Rejoignez-nous