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

Windows Forms Discussion :

[C#2] WndProc quand fenêtre invisible ou afficher la fenêtre


Sujet :

Windows Forms

  1. #1
    Membre expérimenté Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Par défaut [C#2] WndProc quand fenêtre invisible ou afficher la fenêtre
    Voilà le titre est assez long et le problème lui ressemble
    J'ai une application à instance unique (un lecteur multimédia pour ne rien vous cacher) qui lorsqu'on en lance une seconde envoie à la première les arguments qu'elle a reçue.
    Il faut savoir que mon lecteur à la capacité de se mettre en tray et donc de cacher la Form1.
    Si la première instance de l'application possède sa Form1 affichée, aucun problème, le message est catché par WndProc et identifié. Le problème arrive si par malheur notre formulaire est caché (Visible = false), là WndProc n'attrape rien et le message ne sert à rien (même si on remet le formulaire au premier plan).
    J'ai donc pensé à trois solutions :
    -Trouver un autre moyen que WndProc pour attraper un message. J'ai essayé de rajouter un Application.AddMessageFilter mais ça n'avait pas l'air de marcher (il semblait catcher les messages de base du genre Paint ou autre mais plus mon COPYDATA).
    -Forcer l'application à se réouvrir. C'est encore l'idée la plus "chic" je trouve et je me demande s'il n'y a pas une manière d'envoyer un message qui la forcerait (mon formulaire se réaffiche si on clique sur une icône dans le system tray).

    Pour résumer ma question est : comment envoyer un message à autre chose qu'un formulaire :

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    afficher une Form complètement transparente avec Visible=true .
    Pas très élégant mais ça devrait marcher.

    PS : Si tu as des infos sur les limitations de Application concernant la gestion des messages, ça m'intéresse.

  3. #3
    Membre expérimenté Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Par défaut
    Pas élégant mais pas bête du tout une autre idée ? :p

    PS : Si tu as des infos sur les limitations de Application concernant la gestion des messages, ça m'intéresse.
    Bof bof, moi je trichais en essayant de mettre un faux filtre sur mon message mais aussi étrange que ça puisse paraître, il ne catchait jamais mon message (même avec le formulaire affiché). Par contre des informations je n'en ai pas beaucoup (c'était la première fois que j'entendais parler de MessageFilter).

  4. #4
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut Re: [C#2] WndProc quand fenêtre invisible ou afficher la fen
    Citation Envoyé par DeusXL
    ...J'ai une application à instance unique (un lecteur multimédia pour ne rien vous cacher) qui lorsqu'on en lance une seconde envoie à la première les arguments qu'elle a reçue.
    Excuses moi DeusXL, je ne comprends pas vraiment le raisonnement.
    Tu parles bien d'une classe Singleton non ? dans ce cas il n'y a qu'une seule appli(independemment de son interface graphique) en cours. Un nouveau lancement de l'appli influe directement celle déjà en cours.
    Expliques-moi car je crains de ne pas avoir du tout compris ton souci.

  5. #5
    Membre expérimenté Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Par défaut
    Soit je me suis mal exprimmé soit je suis à l'ouest de mon problème (et m'en suis inventé un nouveau).
    Prenons un exemple concret et simple...
    Voyez Windows Media Player. Lorsqu'il n'y a rien lancé et qu'on double clique sur un mp3, il lance WMP et nous joue le mp3. Après si on re-double clique sur un autre mp3, il n'ouvre pas une nouvelle instance mais l'ajoute à la playlist de la première instance.

    Pour résoudre le problème, moi je cherchais à chaque lancement de mon appli si une autre instance existait (Process.GetAllProcess) et si oui j'envoyais via SendMessage un message à cette instance pour qu'elle ajoute à sa playlist la musique demandée.

    Donc en gros le problème, c'est que quand on double-clique sur un fichier dans l'explorateur, il relance une nouvelle instance de l'exécutable de mon application.

    Alors docteur, c'est grave : Me suis-je inventé un problème :

  6. #6
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    En fait, je penses que tu t'es peut être compliqué la tâche, je voyais plutôt ceci Comment ne lancer qu'une seule instance de mon application ?

  7. #7
    Membre expérimenté Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Par défaut
    Je connais cette méthode pour détecter si une instance est déjà lancée (je préfère quand même lister les processus mais bon ça ne compte pas vraiment).
    Là où je bloque c'est surtout pour envoyer à la première instance la chanson passée en argument à ma seconde instance.
    En effet, quand tu double-cliques dans l'explorateur de fichiers sur une chanson, il ouvre mon exécutable en lui passant en paramètre Main(string[] args) la chanson en question.

    Je vais essayer de reformuler encore :p comment faire communiquer deux applications (ou deux instances d'une appli) sur un même PC sans passer par l'override de WndProc(ref Message m) :

    Désolé si je ne comprends pas ce que tu veux me dire, j'ai toujours eu l'impression de me casser la tête sur ce sujet mais je n'arrive pas à trouver où

  8. #8
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    T'inquiètes c'est sûrement moi qui a du mal à sortir d'une grippe qui ne veut pas me lâcher (jsuis dans le gaz ) quelqu'un d'autre va certainement venir à ta rescousse

  9. #9
    DrQ
    DrQ est déconnecté
    Membre émérite
    Avatar de DrQ
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 388
    Par défaut
    Pour faciliter ton problème utilise la technique d'écoute d'un socket sur le localhost.

    Même chez Microsoft leurs softs le font.
    La bonne vieille méthode Unixienne qui fonctionne à merveille

  10. #10
    Membre expérimenté Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Par défaut
    Citation Envoyé par DrQ
    Pour faciliter ton problème utilise la technique d'écoute d'un socket sur le localhost.

    Même chez Microsoft leurs softs le font.
    La bonne vieille méthode Unixienne qui fonctionne à merveille
    Je vais creuser l'idée (j'avoue que je n'en avais jamais entendu parler. Pour moi un socket c'était TcpClient et TcpListener => plein de messages du firewall comme quoi c'est un virus).
    Je mettrais résolu et plus d'infos quand... ce sera résolu

    En tout cas merci de votre aide et bon rétablissement pour neguib !

  11. #11
    Membre expérimenté Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Par défaut
    Citation Envoyé par DrQ
    Pour faciliter ton problème utilise la technique d'écoute d'un socket sur le localhost.

    Même chez Microsoft leurs softs le font.
    La bonne vieille méthode Unixienne qui fonctionne à merveille
    Je me retournes à nouveau vers vous (enfin surtout vers DrQ) pour demander une clarification de quelque chose qui (étonnant non) n'est pas clair chez moi.

    Sur le coup j'ai eu l'impression de comprendre ce dont tu voulais parler mais je me demande si c'est vraiment le cas. Tu parles de Sockets, de quel type de sockets parles-tu ? Je connais l'utilisation du protocole Tcp et j'imagine que ce n'est pas ce dont tu voulais parler pour la raison que j'ai soulevé juste au dessus.

    Je trouve ça quand même étonnant qu'une plateforme comme .NET possède aussi peu de documentation pour la communication entre applications sur un même ordinateur ou alors j'ai mal cherché mais bon

    Et enfin dernière question (j'en pose beaucoup mais si j'ai réponse à une, ça sera suffisant :p) : Quand on double-clique sur ma NotifyIcon, il y a un message envoyé par le système à l'application -ou à l'icône elle-même-, c'est évident (comment saurait-elle qu'on a double-cliqué sinon ?). Quelqu'un pourrait m'éclairer un peu sur comment simuler ce clic car là encore, j'ai beau cherché, je bloque là dessus

  12. #12
    DrQ
    DrQ est déconnecté
    Membre émérite
    Avatar de DrQ
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 388
    Par défaut
    Je parle bien de communication TCP.

    En faisant un peu de recherche je suis tombé la dessus.

    Sinon pour ton firewall normalement il ne doit y avoir de souci si tu ne travaille que sur la boucle locale (127.0.0.1)

  13. #13
    Membre expérimenté Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Par défaut
    Merci beaucoup DrQ (désolé pour le retard) c'est exactement ce que je voulais. Pour le problème de firewall en effet, ce n'était que pur fruit de mon imagination !

    Je lirais sûrement l'article dont tu as donné l'adresse, ça ne coûte rien de se cultiver (même si l'idée des sockets me suffit amplement pour l'instant ).

    Je considère ça comme

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

Discussions similaires

  1. [Débutant] Afficher une fenêtre invisible
    Par Jarell dans le forum C#
    Réponses: 3
    Dernier message: 25/07/2014, 09h29
  2. Réponses: 1
    Dernier message: 05/11/2013, 17h07
  3. Fenêtre invisible en affichant capture d'écran
    Par kawasaki dans le forum Langage
    Réponses: 2
    Dernier message: 05/03/2008, 09h35
  4. [Débutant] Afficher une fenêtre à partir d'une autre fenêtre
    Par fifou91 dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 15/12/2007, 12h15
  5. Réponses: 1
    Dernier message: 16/02/2005, 12h04

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