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

Autres Java Discussion :

Différencier la demande de fermeture via une interface et via un taskkill


Sujet :

Autres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Par défaut Différencier la demande de fermeture via une interface et via un taskkill
    Bonjour,

    N'ayant pas trouvé grand chose sur ce sujet sur internet et ne sachant comment faire je viens vers vous pour le problème suivant:
    - serait-il possible de différencier la demande de fermeture d'une fenêtre (ou application RCP) suivant qu'elle soit faîte via l'interface ou via un signal windows envoyé avec taskkill?

    L'idée serait que l'appli se ferme sans demande de message de confirmation si la demande est faîte en ligne de commande avec un taskkill (sans forcer le fermeture) et de présenter un message de confirmation si la fermeture est lancée via l'interface!

    (Sous Windows évidemment^^)

  2. #2
    Membre Expert Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Par défaut
    Salut,

    Lorsque tu vas essayer de fermer ton application via l'interface, tu vas forcement appuyer quelque part et donc générer un event.

    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
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    class FrameByeBye {
     
        // The method we wish to call on exit.
        public static void showDialog(Component c) {
            JOptionPane.showMessageDialog(c, "Bye Bye!");
        }
     
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
     
                    final JFrame f = new JFrame("Say Bye Bye!");
                    f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                    f.addWindowListener( new WindowAdapter() {
                        @Override
                        public void windowClosing(WindowEvent we) {
                            showDialog(f);
                            System.exit(0);
                        }
                    } );
                    f.setSize(300,200);
                    f.setLocationByPlatform(true);
                    f.setVisible(true);
     
                }
            });
        }
    }
    Terminer ton programme en ligne de commande ne t'affichera rien par définition puisque tu vas forcer le processus à se fermer.


    Cdt.

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Par défaut
    Bonjour,

    Merci de ta réponse, l'idée d'utiliser le listener comme ça est bonne mais j'utilise actuellement eclipse rcp et la fermeture de la fenêtre déclenche une méthode preWindowShellClose(), c'est dans cette méthode qu'une fenêtre de confirmation s'affiche.

    Je suis en train de chercher mais je n'ai toujours pas trouvé comment mettre une sorte de listener sur la fermeture de la fenêtre!

  4. #4
    Membre Expert Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Par défaut
    Ça ne change rien au problème.

    Tu travailles un environnement qui t'es propre, donc tu dois adapter la solution à ton travail.

    L'idée reste que il y à forcément un événement qui est généré lorsque tu appuis quelque part ( sur le bouton de fermeture ou autre ça ne change rien ).
    Donc à toi de l'identifier et d'écrire le code de fermeture à l'intérieur (avec appel d'une boite de confirmation si tu le souhaites ).

    Cdt.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Par défaut
    Oui je sais bien, le problème c'est que la fermeture avec un taskkill ou avec l'icône en haut à droite appelle la même fonction preWindowShellClose() ... Je ne trouve pas de différence entre les 2 types de fermeture dans une appli rcp.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    pas évident de différencier les différentes façons de fermer l'application (on pourrait la fermer également par un menu en plus du bouton en haut à droite), dans la mesure ou toutes passent par un évenement traité par la boucle évenementielle de SWT, y compris le taskkill "soft" qui doit envoyer simplement un évènement à l'application pour qu'elle se ferme.

    On doit pouvoir différencier les sources dans l'écouteur d'évenement, mais il faudrait soit redéfinir la WorkbenchWindow (ce qui n'est pas possible à ma connaissance), soit peut être intercepter un de ses services pour détecter que la fermeture se fait pas une action du workbench pour la différencier d'un signal de l'OS... mais pas évident de l'intercepter "avant" la prise en compte de l'évenement de fermeture du workbench à priori : il faudrait tester...

    J'ai un peu regardé les stacktraces dans les deux cas, et il semble qu'elles soient légèrement différentes. Je ne sais pas si c'est le fruit du hasard, ou propre à mon environnement, ou autre, mais tu peux peut être exploiter cette différence, en cherchant si tu peux déterminer si l'appel passe par une classe dans un cas, et jamais dans l'autre.

    Dans le cas d'un kill j'ai :

    at org.eclipse.swt.widgets.Display.windowProc(Display.java:4619)
    at org.eclipse.swt.internal.win32.OS.PeekMessageW(Native Method)
    at org.eclipse.swt.internal.win32.OS.PeekMessage(OS.java:2976)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3498)
    Dans le cas d'un close j'ai :

    at org.eclipse.swt.widgets.Display.windowProc(Display.java:4619)
    at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
    at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2411)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3501)
    Sinon, question, pourquoi ne pas afficher le dialogue lors d'un taskkill ? est ce que ton but est de pouvoir fermer "silencieusement" ton appli en ligne de commande ? Si c'est le cas, tu peux peut être prévoir plus simplement une commande de fermeture que tu pourrais contrôler du coup (et donc simplement utiliser un booléen pour savoir qu'on est passé par cette commande pour fermer l'application)...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Epiliptik Voir le message
    Oui je sais bien, le problème c'est que la fermeture avec un taskkill ou avec l'icône en haut à droite appelle la même fonction preWindowShellClose() ... Je ne trouve pas de différence entre les 2 types de fermeture dans une appli rcp.
    Première chose à faire, analyse


    breakpoint dans preWindowShellClose().

    Ensuite, tu kille séparément avec taskill et avec la petit croix. Dans le breakpoint, tu remonte la stacktrace jusque at org.eclipse.swt.widgets.Display.windowProc(Display.java:4619)

    Là, tu va trouver le message envoyé par windows à l'application. Est-ce que c'est le même ou il est différents dans les deux cas?

    Si c'est le même -> Pour l'application c'est exactement la même chose, tu l'a dans l'os => boite de confirmation dans tous les cas
    Si c'est différentier, faut voir un peu en aval que est l'instace de Control qui traite ce message (parce que Display dispatche aux différents Control qu'il connait) pour voir si tu n'aurais pas la possibilité de surcharger ce control, pour traiter ce message différement.

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Nico02 Voir le message
    Ça ne change rien au problème.

    Tu travailles un environnement qui t'es propre, donc tu dois adapter la solution à ton travail.

    L'idée reste que il y à forcément un événement qui est généré lorsque tu appuis quelque part ( sur le bouton de fermeture ou autre ça ne change rien ).
    Donc à toi de l'identifier et d'écrire le code de fermeture à l'intérieur (avec appel d'une boite de confirmation si tu le souhaites ).

    Cdt.
    Salut,

    ce serait vrai dans une application écrite complètement soit même, mais là, il s'agit d'une application montée sur un framework (en l'occurence, Eclipse RCP), dans lequel tu peux pas faire tout ce que tu veux malheureusement.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre Expert Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Salut,

    ce serait vrai dans une application écrite complètement soit même, mais là, il s'agit d'une application montée sur un framework (en l'occurence, Eclipse RCP), dans lequel tu peux pas faire tout ce que tu veux malheureusement.
    Effectivement je viens de voir ça. Je n'ai jamais vraiment travailler avec éclipse RCP donc je ne connais pas vraiment son mode de fonctionnement, et malheureusement je n'ai pas vraiment le temps de faire des tests en ce moment..

    Désolé Epiliptik

Discussions similaires

  1. Modification dans une bdd via une liste choisie via une checkbox
    Par LuffyWinchester dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 20/03/2015, 15h41
  2. Réponses: 1
    Dernier message: 03/10/2014, 19h40
  3. Réponses: 9
    Dernier message: 23/12/2012, 10h11
  4. [VB4] Jouer via une interface en ligne
    Par Ticoche dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 09/03/2006, 19h38
  5. Appeler un driver USB via une interface.
    Par HR100 dans le forum Langage
    Réponses: 1
    Dernier message: 19/12/2005, 22h38

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