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

VB.NET Discussion :

Comment éviter un double click sur un toolstrip pour arrêter un thread?


Sujet :

VB.NET

  1. #1
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut Comment éviter un double click sur un toolstrip pour arrêter un thread?
    Bonsoir,

    Dans l'exemple suivant démarrer Notepad++ en appuyant sur 'Démarrer' puis faire un click sur le bouton "arrêter" du form pour arrêter le thread notepad++. Par contre après avoir démarrer Notepad++ il faut cliquer deux fois sur le ToolStrip "Stop2" pour arrêter le thread !

    Pourquoi ? Je n'arrive pas à faire l'opération "arrêter" en un seul click sur le toolstrip. C'est comme si le premier click servait à changer de fenêtre en passant du thread au menu toolstrip. C'est sur que c'est pas très convivial.

    Pour visualiser le problème : Ouvrir une application form avec 2 boutons "Démarrer" et "Arrêter" et un ToolStrip avec un bouton que l'on appellera Stop2.

    Le code de mon exemple :

    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
     Imports System.Threading
     
    Public Class Form1
     
        Dim LeProcess1 As Integer
     
        Public Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Démarrer.Click
            Dim tasks As New List(Of Task)()
            tasks.Add(Task.Run(AddressOf task3))
            Await Task.WhenAll(tasks)
        End Sub
     
        Private Async Function task3() As Task 'démarre le thread
     
            Using myProcess1 As New Process
                Try
                    myProcess1.StartInfo.Arguments = vbNormalFocus
                    myProcess1.StartInfo.FileName = "notepad++"
                    myProcess1.StartInfo.WindowStyle = ProcessWindowStyle.Normal
     
                    'démare l'exe
                    LeProcess1 = Process.Start(myProcess1.StartInfo).Id
                    Thread.Sleep(300)
     
                Catch ex As Exception
                    MessageBox.Show(ex.Message & "Stack Trace: " & vbCrLf & ex.StackTrace)
                End Try
            End Using
            Await Task.WhenAll()
     
        End Function
     
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Stop1.Click
     
            Try
                Dim proc As System.Diagnostics.Process = System.Diagnostics.Process.GetProcessById(LeProcess1)
                proc.Kill()
                MsgBox("process " & LeProcess1 & "   notepad++   " & " est arrêté")
     
            Catch ex As Exception
                'Continu sans générer d'erreur si ID est faux
            End Try
     
        End Sub
     
        Private Sub Stop2_Click(sender As Object, e As EventArgs) Handles Stop2.Click
            Try
                Dim proc As System.Diagnostics.Process = System.Diagnostics.Process.GetProcessById(LeProcess1)
                proc.Kill()
                MsgBox("process " & LeProcess1 & "  notepad++  " & " est arrêté")
     
            Catch ex As Exception
                'Continu sans générer d'erreur si ID est faux
            End Try
        End Sub
    End Class
    En vous remerciant pour vos suggestions.

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    J'ai eu difficile à produire le problème que tu décris et, finalement, je pense qu'il n'y a aucun problème et que le Click du Stop2 arrête le process aussi bien que le bouton "Arrêter".

    Je suppose que tu lances le Notepad avec le bouton "Démarrer" C'est alors le NotePad qui tient le focus.
    Pour avoir accès au ToolStrip, il faut redonner le focus au Form et puis seulement tu peux cliquer le bouton "Stop2".
    Vraisemblablement tu cliques le "Stop2" pour donner le focus au Form et une seconde fois pour vraiment cliquer le Stop2. Cela donne l'impression qu'il faut cliquer 2 fois le Stop2 pour avoir le résultat escompté. Le premier clic, celui qui redonne le focus au Form peut être fait ailleurs que sur le Stop2, n'importe où sur le Form.
    Cela ne semble pas se passer de la même manière avec le bouton "Arrêter" parce que sur le Form, après le lancement du process, c'est le bouton "Démarrer" qui a le focus pas défaut, ce bouton est un composant du Form. Et là, je dois reconnaitre que je ne vois pas trop la nuance ...

    S'il y a un spécialiste du ToolStrip pour nous éclairer ..., je n'ai pas le courage d'entreprendre des recherches sur ce détail.

    ...

  3. #3
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Oui bien sur c'est un détail, mais cela peut devenir vite casse pied si tu le fait cent fois dans l'heure. Il n'ya a pas de problème de fonctionnement mais simplement ce double click inaproprié.

    J'ai corrigé ma demande en mettant une ligne supplémentaire ou il faut lancer Notepad++ avec Démarrer. Désolé pour cet oubli.

    Si quelqu'un as une solution pour donner le focus au Tool strip ?

  4. #4
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    As-tu essayer de cliquer une fois sur le Form avant le Stop2 ?

  5. #5
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Je continue....
    Je suppose que tu as essayé et arrive à la même observation que moi.
    La question est en effet celle dj Focus du Stop2.

  6. #6
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Oui bien sur et ça marche mais finalement tu fait quand même deux click.

    A la réflexion cela veut dire que l'on doit pouvoir le prévoir par programme en créant un click genre 'inutile' sur le form? Je me penche sur la question.

  7. #7
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Il suffit de déclarer à la fin du code de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Public Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Démarrer.Click
            Dim tasks As New List(Of Task)()
            tasks.Add(Task.Run(AddressOf task3))
            Await Task.WhenAll(tasks)
    ToolStrip1.Focus()
        End Sub
    Nota : Les propriétés des toolstripbutton ne prévoient pas l'utilisation de focus mais on peut leurs affecter le focus ainsi.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 512
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 512
    Par défaut
    Cliquer sur le ToolStrip et cliquer sur le bouton du ToolStrip sont 2 choses différentes.
    Et tu peux attribuer la même fonction au bouton "normal" et au bouton du toolstrip, ça évite une duplication de code (rajoute derrière le handles de la fonction, l'événement correspondant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Stop1.Click, Stop2.Click

  9. #9
    Membre éclairé Avatar de Sam Placi
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Octobre 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Octobre 2019
    Messages : 68
    Par défaut
    Bonjour,

    Je regarde ce sujet de loin mais j'ai testé quand même quelques codes pour comprendre.

    Comme Phil Rob, je constate la nécessité de cliquer 2 fois sur le bouton Stop2.

    Si j'ai bien compris, il faudrait, que sans clic préalable, un clic du Stop2 arrête le NotePad de la même manière que le clic du bouton sur le Form.

    J'ai donc testé :
    • ToolStrip1.Focus()
    • Stop2.Select
    • ... Handles Stop1.Click, Stop2.Click



    Aucune des trois méthodes ne solutionne le problème.

    Si quelqu'un a mieux ...

    Sam

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 512
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 512
    Par défaut
    ça a été discuté ici https://learn.microsoft.com/en-us/an...p-single-click => la solution retenue a été d'utiliser l'évément ToolStripItem MouseEnter et donner le focus à la Form, ainsi au 1er clic, la form aurait déjà le focus par le fait de positionner le curseur sur le bouton de la ToolStrip.

    Une alternative, c'est d'indiquer que la form de l'application est toujours au dessus via sa propriété "TopMost" à True (éventuellement, ajouter une case à cocher pour activer ou non ce paramètre)

    Autre solution, créer un ToolStrip personnalisé avec une option ClickThrough https://gis.stackexchange.com/questi...on-first-click

  11. #11
    Membre éclairé Avatar de Sam Placi
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Octobre 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Octobre 2019
    Messages : 68
    Par défaut
    Inspiré par Umfred, j'ai testé le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Stop1.Click, Stop2.Click
            Try
                Dim proc As System.Diagnostics.Process = System.Diagnostics.Process.GetProcessById(LeProcess1)
                proc.Kill()
                MsgBox("process " & LeProcess1 & "  notepad++  " & " est arrêté")
             Catch ex As Exception
                'Continu sans générer d'erreur si ID est faux
            End Try
        End Sub
     
        Private Sub Stop2_MouseEnter(sender As Object, e As EventArgs) Handles Stop2.MouseEnter
            Me.SendToBack()
            Stop2.Select()
        End Sub
    Cela donne le résultat demandé : un seul clic, directement sur le bouton du ToolStrip, fait exactement le même travail que le clic du bouton sur le Form.

    Voila qui devrait ravir Excalybur.

  12. #12
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Super les amis ! Effectivement ma solution n'était pas bonne! Je croyais que c'était bon mais l'application thread passait derrière la fenêtre Form !

    La solution tenait en 4 lignes et elle était à porté de main dans ce site US que je n'ai pas visité ! J'ai cherché des solutions sur les nombreux sites US mais le code n'était pas adaptable car trop ancien.

    J'ai vérifié et cela marche super bien !

    Encore merci pour votre aide.

  13. #13
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut Additif
    Bonjour,

    Si votre application ouvre deux (ou plusieurs) feuilles superposées et pour éviter pendant le simple survol de la souris (sans aucun click) du bouton ToolStrip de voir la disparition en arrière plan du programme en cours il faut modifier le code de la routine Stop2 ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub Stop2_MouseEnter(sender As Object, e As EventArgs) Handles Stop2.MouseEnter
         Me.BringToFront()
             Stop2.Select()
     End Sub
    C'est plus confortable ainsi.

    Voir l'explication ici dans les remarks : https://learn.microsoft.com/en-us/do...owsdesktop-7.0

  14. #14
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 512
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 512
    Par défaut
    Pas testé, mais je pense qu'il n'y pas besoin du Me.BringToFront()/SendToBack()

  15. #15
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Oui dans certains cas (mon programme maitre) et non dans l'exemple actuel ... je n'ai pas cherché l'explication.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment éviter un double click malheureux
    Par Godard dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/10/2010, 18h15
  2. simuler un double click sur une liste dans un dbgrid
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 1
    Dernier message: 01/09/2005, 10h45
  3. comment autoriser le double clic sur un champ desactivé ?
    Par linou dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 28/04/2005, 17h23
  4. Réponses: 4
    Dernier message: 28/07/2004, 10h42

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