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 Discussion :

réduire une application automatiquement dans le systray quand elle démarre


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Points : 41
    Points
    41
    Par défaut réduire une application automatiquement dans le systray quand elle démarre
    Bonjour,

    j'ai fait une application qui peut se réduire dans le systray et se ragrandir quand on double-clique sur son icône.
    Par contre je voudrais qu'elle se lance automatiquement au démarrage de windows directement dans le systray sans que l'on voit la fenêtre du programme.
    J'ai essayé la commande ShowWindow(hwnd,SW_HIDE); dans WM_INITDIALOG ou dans WM_SHOWWINDOW, mais la fenêtre s'affiche quand-même.
    alors à quel moment je peux cacher ma fenêtre?
    J'ai aussi essayé de faire l'inverse : cacher la fenêtre par défaut, puis faire un ShowWindow(hwnd,SW_SHOW); lorsqu'il faut l'afficher.
    Mais la fenêtre s'affiche quand même au démarrage.
    Je précise que j'utilise une DialogBox.

    Merci pour votre aide.

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par dvince38 Voir le message
    Bonjour,

    j'ai fait une application qui peut se réduire dans le systray et se ragrandir quand on double-clique sur son icône.
    Par contre je voudrais qu'elle se lance automatiquement au démarrage de windows directement dans le systray sans que l'on voit la fenêtre du programme.
    J'ai essayé la commande ShowWindow(hwnd,SW_HIDE); dans WM_INITDIALOG ou dans WM_SHOWWINDOW, mais la fenêtre s'affiche quand-même.
    alors à quel moment je peux cacher ma fenêtre?
    J'ai aussi essayé de faire l'inverse : cacher la fenêtre par défaut, puis faire un ShowWindow(hwnd,SW_SHOW); lorsqu'il faut l'afficher.
    Mais la fenêtre s'affiche quand même au démarrage.
    Je précise que j'utilise une DialogBox.

    Merci pour votre aide.
    Tu peux essayer de jouer avec le style (omettre WS_VISIBLE), bien que je ne sois pas sûr du résultat.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    La première fenêtre WS_OVERLAPPED et le premier ShowWindow() sont tous les deux overridés automatiquement par le dernier paramètre de WinMain().

    Si tu veux que ta fenêtre reste invisible, soit tu ne la déclares pas en WS_OVERLAPPED, soit tu peux essayer d'appeler deux fois ShowWindow(), soit tu postes un message WM_COMMAND(ta commande de "réduction") pour qu'elle se réduise sitôt affichée dès que la boucle de messages commande.

    Note: "System Tray" est un abus de langage. Les termes corrects sont Barre des Tâches et Zone de Notification.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    merci pour vos réponses.
    J'ai essayé d'enlever le WS_OVERLAPPED, mais la fenêtre s'affiche toujours.
    En effet, le paramètre nShowCmd de winmain indique si la fenêtre est visible ou caché. Mais, du coup, est ce que l'on peut fixer ce paramètre?
    Comme ma fenêtre principale est une boite de dialogue, elle s'affiche quand on appel la fonction DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DialogProc);
    Il n'y a pas le premier ShowWindow, mais une fois que la fenêtre est affichée, on peut faire un ShowWindow(hwnd,SW_HIDE); pour la cacher.

    Et pour le message, WM_COMMAND, c'est une bonne idée, mais il me faut le handle de la fenêtre et je ne l'obtient que dans le message WM_INITDIALOG, quand la boucle de messages est déjà lancée.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Points : 41
    Points
    41
    Par défaut
    Super, j'ai trouvé tout seul!

    au lieu d'utiliser la fonction DialogBox pour créer la boite de dialogue, j'utilise CreateDialog qui créé la boite mais ne l'affiche pas automatiquement. Il faut ensuite faire un ShowWindow pour l'afficher.

    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
    BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch(uMsg)
        {
            case WM_INITDIALOG:
                /*
                 * TODO: Add code to initialize the dialog.
                 */
                return TRUE;
    
            case WM_CLOSE:
                EndDialog(hwndDlg, 0);
                return TRUE;
    
            case WM_COMMAND:
                switch(LOWORD(wParam))
                {
                    case IDC_BTN_QUIT:
                        EndDialog(hwndDlg, 0);
                        PostQuitMessage (0);
                        return TRUE;
    
                    case IDC_BTN_TEST:
                        MessageBox(hwndDlg, "You clicked \"Test\" button!", "Information", MB_ICONINFORMATION);
                        return TRUE;
                }
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
        }
    
        return FALSE;
    }
    
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    {
        hInst = hInstance;
    
        HWND result=CreateDialog(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DialogProc);
        if(!mode_reduit)
            ShowWindow(result,SW_SHOW);
    
        MSG messages;
        while (GetMessage (&messages, NULL, 0, 0))
        {
            TranslateMessage(&messages);
            DispatchMessage(&messages);
        }
        return messages.wParam;
    }

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/10/2008, 18h56
  2. Réduire une Application dans la barre de notification de windows
    Par Jawad-smart dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 23/06/2008, 23h30
  3. Réduire une application dans la barre des taches
    Par sylchar dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/04/2007, 16h26
  4. [VB6] Réduire en icône une MDI form dans le systray
    Par lefoimpeur dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 12/01/2006, 16h56
  5. Insérer une ligne automatiquement dans une autre tab
    Par davyd dans le forum Langage SQL
    Réponses: 10
    Dernier message: 29/03/2005, 17h08

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