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

MFC Discussion :

Comment mettre une fenêtre au premier plan?


Sujet :

MFC

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut Comment mettre une fenêtre au premier plan?
    Salut,

    Je cherche un moyen pour mettre ma fenêtre au premier plan, j'ai essayé le message WM_ACTIVATE et aussi SetForegroundWindow(HWND) mais j'y arrive pas (ni avec l'un ni avec l'autre)

    Merci de m'aider

  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
    tu veux dire tout le temps au premier plan ?

    Sinon, tu as aussi BringWindowToTop

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par nico-pyright(c)
    tu veux dire tout le temps au premier plan ?
    Non je veut juste faire passer une fenêtre au premier plan quant j'appuye sur une touche (avec le hook)

  4. #4
    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
    tu as essayé BringWindowToTop ? ou tout simplement un ShowWindow ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Pour BringWindowToTop() ça marche pas du tout, et pour ShowWindow je sais pas trop ce qu'il faut mettre, j'ai essayé SW_SHOW et SW_RESTORE la fenêtre passe au premier plan que si elle était (avant) dans le systray ou en tâche d'arrière plan.
    Moi je voudrait qu'elle passe devant dès qu'on le lui dit même si elle se trouve dans la barre des tâches (en fait c'est quant elle se trouve dans la barre de tache que ça marche pas)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par damien99
    Pour BringWindowToTop() ça marche pas du tout
    Rectification: ça marche "comme" avec ShowWindow() (que depuis la systray ou tâche de fond) sauf que la fenêtre ne passe pas au premier plan et la fenêtre active (avant l'appel à BringWindowToTop() ) passe en inactive (donc ausune fenêtre active si vous suivez)
    Tout ça pour dire que "BringWindowToTop()" fait quelque chose.

  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
    regarde ici ... http://www.developpez.net/forums/vie...ght=showwindow

    une bidouille ... mais bon

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    En combinant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ::SetWindowPos(m_hWnd ,HWND_TOPMOST,...,...,...,...,SWP_SHOWWINDOW); 
    ::SetWindowPos(m_hWnd ,HWND_NOTOPMOST,...,...,...,...,SWP_SHOWWINDOW); 
    //et le code pour setFocus
    ça devrait le faire il me semble.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par nico-pyright(c)
    regarde ici ... http://www.developpez.net/forums/vie...ght=showwindow

    une bidouille ... mais bon
    je me suis servi de ça, ça fait un peu bricolo mais ça marche voila mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ShowWindow(hwnd, SW_MINIMIZE); 
    ShowWindow(hwnd, SW_SHOWNORMAL);

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    En fait pour que "SetForegroundWindow(HWND)" fonctionne il ne faut pas l'appeller depuis l'instance de la fenêtre que l'on veut mettre au premier plan.

    La solution que j'ai trouvé est d'appeller cette fonction depuis une DLL.


  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par damien99
    En fait pour que "SetForegroundWindow(HWND)" fonctionne il ne faut pas l'appeller depuis l'instance de la fenêtre que l'on veut mettre au premier plan.

    La solution que j'ai trouvé est d'appeller cette fonction depuis une DLL.

    En fait j'ai eu d'autre problème avec SetForegroundWindow(HWND) et après 4h d'acharnement (j'ai fait une cinquantaines de test et X recherches) j'ai réussit à comprendre mon problème :

    En fait Windows interndit à l'application de mettre des fenêtres au premiers plan si l'application elle même n'est pas à l'avant plan.
    L'astuce consiste donc à attacher un thread sur l'application qui est à l'avant plan et d'y executer notre fonction SetForegroundWindow(HWND) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ShowWindow(hwnd, SW_RESTORE);   //la fenêtre doit être restaurée pour que SetForegroundWindow fonctionne
     
    DWORD foregroundThreadID = GetWindowThreadProcessId(GetForegroundWindow(), 0);   //ID du thread au premier plan
    DWORD ourThreadID = GetCurrentThreadId();   //ID de notre thread (thread de l'application)
     
    if (foregroundThreadID != ourThreadID)   //si notre application n'est pas à l'avant plan
    {
        AttachThreadInput(foregroundThreadID, ourThreadID, TRUE);   //on attache le thread de notre application sur le thread de l'application qui est au premier plan
        SetForegroundWindow(hwnd);   //maitenant on peut faire passer notre fenêtre au premier plan
        AttachThreadInput(foregroundThreadID, ourThreadID, FALSE);   //on détache le thread
    }
    else
         SetForegroundWindow(hwnd);    //si notre notre application est à l'avant plan on utilise directement SetForegroundWindow
    Ce code doit être placé dans la boucle principale du programme et non pas dans un thread

    PS: Si on utilise SetForegroundWindow dans un hook (comme je faisait avant) on a pas ce problème car un hook c'est toujours à l'avant plan.


  12. #12
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Salut,

    qu'est ce qui se passe si ton application est dans la barre des tâches et qu'il n'y a aucune autre application qui tourne ? Ca marche quand même ?
    "Don't think you are, know you are..." (Morpheus)

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 19/04/2009, 12h14
  2. Réponses: 5
    Dernier message: 27/08/2007, 10h40
  3. [Débutant] Mettre une fenêtre au premier plan
    Par richard_sraing dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 07/06/2007, 11h02
  4. Réponses: 2
    Dernier message: 20/12/2006, 14h31
  5. Mettre une fenêtre au premier plan
    Par Riko dans le forum Delphi
    Réponses: 4
    Dernier message: 20/06/2006, 19h30

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