Process.kill() ne marche pas [Résolu]

jnbrunet 265 Messages postés samedi 25 décembre 2004Date d'inscription 13 novembre 2012 Dernière intervention - 27 mars 2007 à 01:35 - Dernière réponse : jnbrunet 265 Messages postés samedi 25 décembre 2004Date d'inscription 13 novembre 2012 Dernière intervention
- 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-
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
jnbrunet 265 Messages postés samedi 25 décembre 2004Date d'inscription 13 novembre 2012 Dernière intervention - 28 mars 2007 à 20:29
3
Merci
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-

Merci jnbrunet 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de jnbrunet
cs_fauve 661 Messages postés vendredi 2 décembre 2005Date d'inscription 23 mars 2011 Dernière intervention - 27 mars 2007 à 08:07
0
Merci
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 ?


@+
Commenter la réponse de cs_fauve
drikce06 2247 Messages postés lundi 29 mai 2006Date d'inscription 29 mai 2008 Dernière intervention - 27 mars 2007 à 08:17
0
Merci
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:
Commenter la réponse de drikce06
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 27 mars 2007 à 08:27
0
Merci
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
Commenter la réponse de Renfield
cs_fauve 661 Messages postés vendredi 2 décembre 2005Date d'inscription 23 mars 2011 Dernière intervention - 27 mars 2007 à 11:29
0
Merci
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.

@+
Commenter la réponse de cs_fauve
jnbrunet 265 Messages postés samedi 25 décembre 2004Date d'inscription 13 novembre 2012 Dernière intervention - 27 mars 2007 à 13:38
0
Merci
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-
Commenter la réponse de jnbrunet
drikce06 2247 Messages postés lundi 29 mai 2006Date d'inscription 29 mai 2008 Dernière intervention - 27 mars 2007 à 13:45
0
Merci
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:
Commenter la réponse de drikce06
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 27 mars 2007 à 14:28
0
Merci
mets Byval, As Integer et colle lui un 0 ca ira bien la plupart du temps

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
jnbrunet 265 Messages postés samedi 25 décembre 2004Date d'inscription 13 novembre 2012 Dernière intervention - 28 mars 2007 à 03:38
0
Merci
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-
Commenter la réponse de jnbrunet
drikce06 2247 Messages postés lundi 29 mai 2006Date d'inscription 29 mai 2008 Dernière intervention - 28 mars 2007 à 08:07
0
Merci
Le handle est valide?

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
Commenter la réponse de drikce06
jnbrunet 265 Messages postés samedi 25 décembre 2004Date d'inscription 13 novembre 2012 Dernière intervention - 28 mars 2007 à 17:25
0
Merci
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-
Commenter la réponse de jnbrunet
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 28 mars 2007 à 19:27
0
Merci
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
Commenter la réponse de Renfield

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.