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 :

CreateProcess en avant plan


Sujet :

Windows

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 66
    Points : 42
    Points
    42
    Par défaut CreateProcess en avant plan
    rebonjour

    cette fois j ai deux createprocess plus ou moins consecutifs, et je voudrais que la fenetre ouverte par le 2eme apparaisse par dessus toutes les autres...

    j ai un code dans ce genre la


    memset(&siStartupInfo, 0, sizeof(siStartupInfo));
    memset(&piProcessInfo, 0, sizeof(piProcessInfo));
    siStartupInfo.cb = sizeof(siStartupInfo);
    siStartupInfo.dwFlags = STARTF_USESHOWWINDOW;
    siStartupInfo.wShowWindow = SW_SHOW;
    CreateProcess(NULL,"\"./anim domino 2.exe\"",0,0,FALSE,
    CREATE_DEFAULT_ERROR_MODE,0,0,
    &siStartupInfo,&piProcessInfo);

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Tu peux tenter un WaitForInputIdle() sur le premier processus (si ce n'est pas un programme console) avant de lancer le second...

  3. #3
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Soit tu place ta fenêtre en mode "top most" -> FAQ

    Cela te permet de placer ta fenêtre au dessus des autres et elle reste au dessus des autres.

    Soit tu envoies le message HWND_TOP à la place de HWND_TOPMOST, qui la place au dessus des autres sans qu'elle n’ait un comportement particulier, en dehors du fait qu'elle se mette au dessus des autres.

    (Pour l'envoyer directement à un autre process, regarder du côté des messages MSDN)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 66
    Points : 42
    Points
    42
    Par défaut
    me revoila, apres une dramatique panne d internet, j ai toujours pas de solution. j avais laisse le c++ depuis bien trop d'annees

    donc je m explique:

    je fais un createprocess qui lance une anim flash (.exe) en plein ecran
    j attends un msg particulier sur un socket et
    quand le msg arrive, je lance une deuxieme ani flash

    et bien sur je voudrais aue la 2eme anim soit au premier plan.


    ce qui est louche c'est que si je fais seulement les 2 createprocess, ca marche,
    et si j attends le message pour lancer l autre, ca foire...


    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
    int main()
    {
    	CreateProcess(NULL,"\"./anim1.exe\"",0,0,FALSE,
    				CREATE_DEFAULT_ERROR_MODE,0,0,
                                  		&siStartupInfo,&piProcessInfo);
    
    	client e(9000); // Le parametre est le numero de port
    	e.attente_connexion();
    	e.recevoir_donnees (buff,3);
                 if (1/*c'est le bon msg*/)
    	{
    		CreateProcess(NULL,"\"./anim2.exe\"",0,0,FALSE,
    		 CREATE_DEFAULT_ERROR_MODE,0,0, 
                               &siStartupInfo,&piProcessInfo);
    		e.envoyer_donnees ("C PARTI\0",8);
    	}
    	e.fermer_connexion();
    	return EXIT_SUCCESS;
    }
    voila le code tres peu élagué.

    j ai bien sur essaye de positionner les parametres de siStartupInfo, mais sans succes, ca ne change rien.

    et je ne sais pas comment on arrive a recuperer le handle de fenetre d une autre appli, pour la mettre derriere par exemple.

  5. #5
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Il y a
    Qui te permettrait de récupérer l'handle de fenêtre


    Dans ta fonction "EnumWindowsCoord" passé en paramêtre à ::EnumWindows(), test ensuite si

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	unsigned long num_id;
    	::GetWindowThreadProcessId(hWnd,&num_id);
    
    //Si les 2 id sont identiques ! Sauvegarde l'handle de la fenêtre
    	if(process_id == num_id)
    		hWnd_sel_appli=hWnd;
    Pour récupérer l'id de ta fenêtre que tu viens de lancer avec CreateProcess et dont tu as besoin si dessus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	PROCESS_INFORMATION pi;
    ...
    CreateProcess(...)
    ...
    	process_id=pi.dwProcessId;

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 66
    Points : 42
    Points
    42
    Par défaut
    merci TiR
    l idee est excellente
    mais...

    apres l appel au createprocess, la struct pi ne contient toujours que des 0 quand je fais du pas a pas....


    EDIT
    voila le probleme, la fenetre n est pas encore ouverte quand je lance le enumWindows, de suite apres le createprocess, et donc il ne la trouve pas.

    j ai pense faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (hFenetre == 0)
    	::EnumWindows(pCallBack, pi);
    mais ca consomme tout le porcesseur, et donc cq rqlenti l ouverture de la fenetre qui m interresse..
    y aurait-il un moyen de faire attendre un peu avant de faire enumwindows, sans ralentir l ordinateur ?


    RE-EDIT:
    j ai tout betement trouve la fonction Sleep() pour attendre un peu, donc ca laisse le temps a la fenetre de s'ouvrir, je recupere impeccablement le HWND associe, et là.... j utilise ::BringWindowToTop(hFenetre) pour la mettre devant.
    eh bien non, elle reste encore derriere....
    une idee ?

  7. #7
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (hFenetre == 0)
    {
                 ::EnumWindows(pCallBack, pi);
                 Sleep(200);
    }
    ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 66
    Points : 42
    Points
    42
    Par défaut
    merci Ti-R, cf edit au dessus

  9. #9
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Comme indiqué au dessus dans mon premier post du thread.

    SetDialogAlwaysOnTop

    avec HWND_TOP

    Si cela ne fonctionne pas

    premier appel avec HWND_TOPMOST
    sleep
    second appel avec HWND_TOP

    ps: Logiquement cela fait la même chose que BringWindowToTop, mais je n'ai jamais utilisé BringWindowToTop

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 66
    Points : 42
    Points
    42
    Par défaut
    eh bien oui, logiquement ca fait le meme chose que bringwindowonttop, a la difference pres que CA MARCHE !

    donc au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CreateProcess(NULL,"\"./anim domino 2.exe\"",0,0,
    		FALSE,CREATE_DEFAULT_ERROR_MODE,
    		0,0, &siStartupInfo,&piProcessInfo);
    {	
    	DWORD pi = piProcessInfo.dwProcessId;
    	Sleep(1000);
    	while (hFenetre == 0) ::EnumWindows(pCallBack, pi);
    	::SetWindowPos(hFenetre ,HWND_TOPMOST, 0 , 0, 0, 0,SWP_NOSIZE);
    }

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pourquoi utiliser le Sleep(1000), qui n'est pas garanti marcher, au lieu de :
    Citation Envoyé par Celui qu'on ne lit pas
    Tu peux tenter un WaitForInputIdle() sur le premier processus (si ce n'est pas un programme console) avant de lancer le second...

  12. #12
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    A corriger en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CreateProcess(NULL,"\"./anim domino 2.exe\"",0,0,
    		FALSE,CREATE_DEFAULT_ERROR_MODE,
    		0,0, &siStartupInfo,&piProcessInfo);
    {	
    	DWORD pi = piProcessInfo.dwProcessId;
    	
    	while (hFenetre == 0)
    	{
    		::EnumWindows(pCallBack, pi); // cherche
    		Sleep(200); // atttend un peu
    	}
    	::SetWindowPos(hFenetre ,HWND_TOPMOST, 0 , 0, 0, 0,SWP_NOSIZE);
    }
    Car si le lancement dépasse 1 seconde, le while boucle sans attendre... et donc le processeur va fonctionner à 100% avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sleep(1000);
    while (hFenetre == 0) ::EnumWindows(pCallBack, pi);

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 66
    Points : 42
    Points
    42
    Par défaut
    @TiR
    c'est fait comme ca en fait.

    @medinoc
    WaitForInputIdle... mais y'a beaucoup trop de syllabes la dedans, moi au dessus de 3 syllabes je commence a chauffer :-D

    merci a tous

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Dommage, car c'est exactement ce qu'il te fallait.

    Bonne chance quand tu auras besoin de connaître la taille d'un texte à l'écran (GetTextExtentPoint32()) ou d'énumérer les processus actifs (CreateToolhelp32Snapshot())...

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 66
    Points : 42
    Points
    42
    Par défaut

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

Discussions similaires

  1. formulaire en "avant-plan"
    Par questions dans le forum IHM
    Réponses: 2
    Dernier message: 08/06/2006, 19h27
  2. [VBA-E] pb positionnement en avant-plan d'une textbox
    Par bandit boy dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/04/2006, 08h28
  3. Mode console toujours en avant plan ....
    Par Alice9 dans le forum MFC
    Réponses: 10
    Dernier message: 27/09/2005, 13h38
  4. Comment faire pour qu'une Form reste en avant-plan?
    Par Bodom-Child dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/08/2005, 10h28
  5. Mettre en avant plan une autre application...
    Par loupdeau dans le forum MFC
    Réponses: 13
    Dernier message: 19/05/2005, 13h26

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