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] Empêcher qu'une form prenne le contrôle


Sujet :

Windows Forms

  1. #1
    Membre actif 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
    Points : 272
    Points
    272
    Par défaut [C#2] Empêcher qu'une form prenne le contrôle
    Bonjour à vous tous, je viens vous présenter deux problèmes qui ont une solution très proche à mon avis (sinon identique).

    Premier :
    J'ai un formulaire avec TopMost mis à true et je voudrais qu'on puisse cliquer sur les boutons et intéragir avec sans pour autant qu'il prenne le focus. Quel intérêt ?
    Simple : si par exemple quelqu'un est en train de jouer et qu'il clique sur un bouton, son jeu se réduira pour laisser le focus à mon premier formulaire... Or c'est bien connu, ALT TAB n'est pas l'ami des jeux.

    Deuxième :
    Je voudrais créer une petite notification type MSN Messenger (vous voyez les trucs qui disent "XXX vient de se connecter" ou alors "Vous avez été déconnecté car un hacker vous a hacké"). Tout fonctionne (pour ceux qui veulent savoir j'utilise le formulaire TaskBarNotifier de NetXP), mais comme la fenêtre est en TopMost là encore, elle prend le focus et si l'utilisateur était en train de taper un message, ça l'arrête voire pire ça fait comme s'il avait cliqué sur la notification. Y a-t-il un moyen pour dire à ce formulaire de ne pas prendre le focus lorsqu'il est créé ?

    [EDIT]Je rajoute un troisième problème encore plus bête :
    Il y a-t-il un moyen simple pour qu'un formulaire ne se voit pas lorsqu'on fait ALT-TAB ? Je sais mettre ShowInTaskbar à false mais comment faire pour que lorsqu'on fait ALT TAB on ne le voit pas non plus ?[/EDIT]

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    a mon avis, le plus simple pour qu'elle ne prenne pas le focus, est quelle ne soit pas activée
    Tu peux utiliser l'API ShowWindow avec SW_SHOWNOACTIVATE

    Pour que quand on clique dessus et qu'elle ne prenne pas le focus, il faudra surcharger la méthode de traitement des messages, intercepter le message d'activation et le remplacer.

  3. #3
    Membre actif 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
    Points : 272
    Points
    272
    Par défaut
    Merci pour ta réponse

    Je vais me pencher sur SW_SHOWNOACTIVATE (je me disais aussi qu'il y avait un truc dans le genre).

    Sinon, quand on clique sur un bouton, c'est le formulaire qui sélectionne lui-même de se donner le focus (c'est ce que j'ai cru comprendre en lisant ce que tu as écrit) ? Si oui alors je vois ce qu'il faudrait faire en effet

  4. #4
    Membre actif 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
    Points : 272
    Points
    272
    Par défaut
    Pour mon premier problème j'ai déjà trouvé Form.ShowWithoutActivation qui semble correspondre parfaitement à ce que je cherche. Seul ennui : c'est quelque chose à overrider et NetXP ne permet pas d'overrider son TaskBarNotifier mais c'est quand même déjà ça

  5. #5
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    pour ton premier problème, tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            [DllImport("user32.dll")]
            static extern Boolean ShowWindow(IntPtr hwnd, int cmdShow);
            private const int SW_SHOWNOACTIVATE = 4;
            public void showNoActivate()
            {
                ShowWindow(this.Handle, SW_SHOWNOACTIVATE);
            }
    pour ton deuxième problème, il faut t'inspirer de ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            private const int WM_MOUSEACTIVATE = 0x0021, MA_NOACTIVATE = 0x0003;
     
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_MOUSEACTIVATE)
                {
                    m.Result = (IntPtr)MA_NOACTIVATE;
                    return;
                }
                base.WndProc(ref m);
            }
    sachant que ceci fonctionne tel quel pour la form et que si tu veux que cela fonctionne pour un bouton, tu devras soit dériver le bouton pour utiliser le meme principe, soit sous-classer le buton pour avoir accès à sa callback de traitement des messages (utiliser SetWindowLong)

  6. #6
    Membre actif 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
    Points : 272
    Points
    272
    Par défaut
    Et bien mis à part mon troisième problème (qui est mineur), tout est résolu donc merci bien

    Ca mérite mon premier click sur le nouveau boutton Résolu !

  7. #7
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Pour ton troisième problème que je n'avais pas vu, ca dépend si tu veux qu'il y ait une bordure ou pas
    Si tu ne veux pas de bordure, il suffirait de passer FormBorderStyle à FixedToolWindow (ou SizableToolWindow) avec le ShowInTaskbar à false.
    Si tu veux une bordure, il faudra appliquer le style WS_EX_TOOLWINDOW en combinaison avec showInTaskbar à false
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams p = base.CreateParams;
                    p.ExStyle |= 0x00000080;  // WS_EX_TOOLWINDOW
                    return p;
                }
            }
    C'est aussi ma première aide dans le langage c# ... je fete aussi ma premiere fois

  8. #8
    Membre actif 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
    Points : 272
    Points
    272
    Par défaut
    Citation Envoyé par nico-pyright(c)
    C'est aussi ma première aide dans le langage c# ... je fete aussi ma premiere fois
    Pour une première en C# aide c'est plutôt complet

    Bouton résolu confirmé, ça fonctionne à merveille, et comme à chaque fois que je pose une question au sujet des Windows Forms j'ai l'impression qu'il me faudrait reprendre les cours d'API Win32

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

Discussions similaires

  1. Empêcher ouvrir une form deux fois
    Par sondo dans le forum Langage
    Réponses: 6
    Dernier message: 13/02/2009, 11h58
  2. Réponses: 5
    Dernier message: 28/03/2008, 17h18
  3. empêcher le déplacement d'une Form
    Par orobin dans le forum Windows Forms
    Réponses: 3
    Dernier message: 21/12/2007, 13h33
  4. Empêcher une forme de se redimensionner
    Par dz_bill dans le forum Delphi
    Réponses: 3
    Dernier message: 24/02/2007, 17h03

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