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 :

[Débutant] Empêcher un process d'être "iconisé"


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut [Débutant] Empêcher un process d'être "iconisé"
    Bonjour,

    Petit soucis: depuis un programme en VC++, je fais un ShellExecuteEx pour lancer un autre .EXE, dont je dois attendre la fin avant de continuer. Je fais donc mon ShellExecuteEx, puis un WaitForSingleObject, ce qui marche très bien.

    Mon problème, c'est qu'un autre programme (en l'occurence Lotus Notes) affiche parfois un message pour signaler qu'un mail vient d'arriver, ce qui iconise le .EXE que j'ai lancé dans la barre de tâches. Et ça, je n'en veux pas !

    Y aurait-il un truc pour signaler que mon .EXE doit toujours rester maximisé et au premier plan ? Un paramètre de ShellExecuteEx, peut-être ? Ou une commande à appliquer au process de mon .EXE avant le WaitForSingleObject ?

  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
    le programme qui est lancé, c'est toi qui le fait ? tu peux le modifier ? dans ce cas, c'est assez simple, tu interceptes le message d'iconification.

    Sinon, tu peux aussi récuperer son handle avec FindWindow et utiliser SetWindowPos avec un HWND_TOPMOST, ca suffira peut-etre (ca dépend de ce que fait exactement Lotus.

    Sinon, tu peux faire un hook sur l'iconification de ton process, et l'empecher.

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci de cette réponse rapide, Nico.

    C'est moi qui ai fait le programme qui est lancé, mais il est dans un autre langage; je n'ai accès qu'aux API Windows. J'ai essayé de tester "IsIconic", mais apparemment ça ne marche pas (ou pas à chaque fois, je ne sais pas...). Je préférerais donc agir depuis le programme appelant.

    Sinon, le concept de "hook" m'est totalement étranger; c'est quoi et comment on fait ? Quelqu'un aurait un exemple de code pour l'iconisation ?

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Si tu peux utiliser l'api Win32 c'est très bien. Ce sera beaucoup plus simple de modifier le prog lancé, que de le faire depuis un autre prog (faudra faire la même chose dans les 2 cas de toutes façons).
    Je pense que retirer le style WS_MINIMIZEBOX (l'idéal serait de le faire au moment de la création dans ton langage : retirer le bouton minimiser) de ta fenêtre devrait suffire (mais elle ne sera plus minimizable du tout).
    Pour le faire après coup:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            SetWindowLong(
                hWnd,
                GWL_STYLE,
                GetWindowLong( hWnd, GWL_STYLE ) & (~WS_MINIMIZEBOX) );

  5. #5
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Si tu peux utiliser l'api Win32 c'est très bien. Ce sera beaucoup plus simple de modifier le prog lancé, que de le faire depuis un autre prog (faudra faire la même chose dans les 2 cas de toutes façons).
    Je pense que retirer le style WS_MINIMIZEBOX (l'idéal serait de le faire au moment de la création dans ton langage : retirer le bouton minimiser) de ta fenêtre devrait suffire (mais elle ne sera plus minimizable du tout).
    Pour le faire après coup:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            SetWindowLong(
                hWnd,
                GWL_STYLE,
                GetWindowLong( hWnd, GWL_STYLE ) & (~WS_MINIMIZEBOX) );
    [Un peu HS]
    Ce que je trouve pas terrible dans Windows, c'est que même avec ces paramètres, on peut toujous minimiser à partir du gestionnaire des tâches (bouton droit sur le programme -> Réduire)... J'ai déjà dû bien gruger pour empècher la maximisation d'un de mes programmes.... (même combat que la minimisation) ('tention je parle bien du gestionnaire des tâches et non pas de la barre des tâches).
    [/Un peu HS]

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Tu empêches comment la maximisation ?

  7. #7
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    Je redimensionne après-coup.

    Au début je voulais récupérer le message WM_SYSCOMMAND, paramêtre SC_MAXIMIZE, mais çà ne marche pas. En fait, en affichant les messages reçus, je me suis aperçu que le fait d'utiliser le gestionnaire des tâches pour maximiser ne génère pas de SC_MAXIMIZE (contrairement au bouton Maximiser), mais les messages WM_WINDOWPOSCHANGING (avant le redimensionnement) et WM_WINDOWPOSCHANGED (une fois le redimensionnement terminé). Problème : en bloquant WM_WINDOWPOSCHANGING, la fenêtre se redimensionne quand même.

    Donc je récupère WM_WINDOWPOSCHANGED, et j'annule le redimensionnement en faisant un SetWindowPos... Mais il faut faire attention car WM_WINDOWPOSCHANGED est appelé à divers endroits donc il faut savoir si c'est légitime (appel de SetWindowPos dans mon code, création de la fenêtre, fermeture de la fenêtre, fenêtre qui bouge...) ou pas (gestionnaire des tâches qui veut redimmensionner mon appli). Ceci grâce à une variable booléenne placée dans ma classe application... Et si c'est illégitime, donc, je fais mon SetWindowPos

    J'ai comme l'impression que je me suis pris la tête pour pas grand chose mais çà marche
    En revanche qqun a une solution plus propre je suis preneur

  8. #8
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Ok, merci, ça me donne pas mal de pistes à explorer.

    Sinon, pour en revenir au hook sur l'iconisation du programme appelé depuis le programme appelant: comment vous le feriez, vous ?

  9. #9
    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
    si tu peux agir sur le programme destination par programmation, ca n'a pas d'interet de faire un hook. Le principe est toujours d'intercepter le message d'iconification, mais pour toutes les applications et de filtrer seulement celle qui nous interesse

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Le hic c'est que y'a pas de message de minimisation. Tu peux intercepter un message tel que WM_SYSCOMMAND qui demande de te minimiser, mais tu ne peux rien faire si l'autre fenêtre fait un ShowWindow( SW_MINIMIZE ), enfin pas que je sache.
    Tu reçois WM_SIZE + SIZE_MINIMIZED après que la minimisation ait eu lieu, pas avant.
    Pour la maximisation c'est pareil, mais on doit pouvoir gruger grâce à WM_GETMINMAXINFO. En donnant comme taille max celle de ta fenêtre. Reste la position qui bouge dans le coin supérieur gauche, en modifiant lors de WM_WINDOWPOSCHANGING ça doit être jouable (quoique sûrement pas très évident de faire ça proprement).
    Bref le plus simple et le plus sûr c'est de réagir après coup et de restaurer la fenêtre dans son état normal.
    Pour interdire totalement, je pense que c'est avec WM_WINDOWPOSCHANGING mais faudrait étudier comment ça fonctionne réellement et j'ai pas le temps. J'ai regardé vite fait : ca a l'air assez complexe car il joue avec le handle insertAfter et divers flags dont un apparement non documenté (0x8000). Je suis arrivé à empêcher de minimiser, mais la fenêtre ne se redessine plus...
    Je me demande si en interne Windows ne considère pas que la fenêtre est minimisée (même si j'ai fait en sorte qu'elle ne le soit pas) et ne lui envoir plus de messages...). Bref ça sent le truc tordu non documenté.
    Si je voulais vraiment interdire le redimensionnement, je me tournerais vers une autre solution genre patcher les API ShowWindow etc... pour refuser l'appel sur ma fenêtre.

    en bloquant WM_WINDOWPOSCHANGING, la fenêtre se redimensionne quand même
    ouai il est pas facile à maitriser ce message. Avec WM_GETMINMAXINFO tu dois pouvoir bloquer la taille max.

  11. #11
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci à tous pour ces réponses très complètes.

    Dans les faits, c'est la première réponse qui a le mieux marché. Dans le programme appelé (où, pour mémoire, je n'ai accès qu'aux API Windows), je fais un "SetWindowPos" avec HWND_TOPMOST, et les messages d'alerte de Notes ne minimisent plus mon appli.

    Je considère donc ce post comme "Résolu".
    Encore merci!

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

Discussions similaires

  1. Empêcher un bouton d'être imprimé
    Par beegees dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 11/09/2006, 22h20
  2. [Débutant]empécher redimensionnement d'une fenètre
    Par yottatiger dans le forum GLUT
    Réponses: 1
    Dernier message: 11/06/2006, 01h43
  3. [débutant] erreur "indice de liste hors limites(1)"
    Par lidouka dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2005, 14h31

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