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

Visual C++ Discussion :

Remettre un exe au premier plan [FAQ]


Sujet :

Visual C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 54
    Points : 36
    Points
    36
    Par défaut Remettre un exe au premier plan
    Bonjour,

    Je souhaite pouvoir demarrer des executables (listés dans mon .ini) depuis le menu de la barre de titre de mon application (par l'icone en haut à gauche).
    Dans le cas ou l'on lance un exe déjà démarrer, je veux simplement le remettre au premier plan.

    Voici mon code :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    LRESULT CProductionDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    	CString sCleName,s;
    	UINT nIndex;
     
    	BOOL bResult=TRUE;
     
    	TCHAR szCle[MAX_CLE];
     
    	// TODO: Add your specialized code here and/or call the base class
    	// Lancement des exe utilisateur sur choix menu
    	switch(message)
    	{
     
    		case WM_SYSCOMMAND :
    			nIndex= LOWORD (wParam)-ID_EXE;
     
    			if(nIndex>0 && nIndex<=NB_EXE_MAX)
    			{	
    				if(m_hExe[nIndex-1]!=NULL)	
    				{
    					//Process touijours present
    					DWORD dwExitCode = 0;
    					GetExitCodeProcess(m_hExe[nIndex-1], &dwExitCode);
    					if(dwExitCode == STILL_ACTIVE) //process toujours présent ?
    						::SetForegroundWindow((HWND) m_hExe[nIndex-1]); //Premier plan
    					else
    						m_hExe[nIndex-1]=NULL;
    				}
     
    				// si l'exe n'existe pas on le lance	
    				if(m_hExe[nIndex-1]==NULL)
    				{
     
    					sCleName.Format("%s%d",PATH_EXE_ENTETE,nIndex);
    					GetPrivateProfileString(SECTION_EXECUTABLES, sCleName, "", szCle, MAX_CLE, INIFILE);
     
    					STARTUPINFO         siStartupInfo;
    					PROCESS_INFORMATION piProcessInfo;
     
    					memset(&siStartupInfo, 0, sizeof(siStartupInfo));
    					memset(&piProcessInfo, 0, sizeof(piProcessInfo));
    					siStartupInfo.cb = sizeof(siStartupInfo);
    					if(CreateProcess(NULL,szCle,0,0,FALSE,
    						CREATE_DEFAULT_ERROR_MODE,0,0,                              
    						&siStartupInfo,&piProcessInfo) == FALSE)
    					{
    						// erreur
    						CString s;
    						s.Format("Erreur d'ouverture de l'utilitaire %s",szCle);
    						AfxMyMessageBox(s,MB_ICONERROR);
    					}
    					else
    					{
    						m_hExe[nIndex-1] = piProcessInfo.hProcess;
    					}
     
    				}
    			}
    			break;
    Tout fonctionne sauf le passage au premier plan par ::SetForegroundWindow.
    Je pense que cela vient du fait que ::SetForegroundWindow travaille sur un HWND et piProcessInfo.hProcess sur un HANDLE, mais je ne vois pas bien comment passer de l'un à l'autre.

    Merci de votre aide.

  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
    ce n'est pas la meme chose
    tu dois avoir un handle de fenetre, qui peut etre donné par FindWindow par exemple
    tu peux aussi utiliser ShellExecuteEx au lieu de CreateProcess et utiliser les flags d'affichage en avant plan

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    Bonjour,

    Merci pour ton aide,

    Je ne vois pas bien comment utiliser FindWindow dans mon cas, car les exes sont paramètrables dans le .ini et je ne connais donc pas les nom à l'avance.

    J'ai essayé ShellExecuteEx mais je n'arrive pas à récuper le HANDLE pour tester si l'exe est déjà démarré.
    Quel est le flag pour forcer en premier plan : Avec SH_SHOW l'appli ne reste pas au premier plan

    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
     
    	SHELLEXECUTEINFO ExecuteInfo;    
    					memset(&ExecuteInfo, 0, sizeof(ExecuteInfo));
     
    					ExecuteInfo.cbSize       = sizeof(ExecuteInfo);
    					ExecuteInfo.fMask        = 0;                
    					ExecuteInfo.hwnd         = 0;                
    					ExecuteInfo.lpVerb       = "open";                      
    					ExecuteInfo.lpFile       = szCle;
    					ExecuteInfo.lpParameters = NULL;
    					ExecuteInfo.lpDirectory  = 0;
    					ExecuteInfo.nShow        = SW_SHOW;
    					ExecuteInfo.hInstApp     = 0;    
    					if(ShellExecuteEx(&ExecuteInfo) == FALSE)
    					{
    						// erreur
    						CString s;
    						s.Format("Erreur d'ouverture de l'utilitaire %s",szCle);
    						AfxMyMessageBox(s,MB_ICONERROR);
    					}
    					else 
    					{
    						m_hExe[nIndex-1] = ExecuteInfo.hProcess;
    					}
    ExecuteInfo.hProcess ne contient pas le HANDLE, ni Execute.hwnd.

  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
    SW_SHOWNORMAL devrait marcher

    sinon, essaie un truc du genre
    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
    HWND  g_hwnd;
    int  g_nFound;
     
    BOOL CALLBACK FindHwndFromPID( HWND hwnd, LPARAM lParam) :
     
     
    HWND GetHwndFromPID ( DWORD dwProcessId)
    {
     g_hwnd = NULL;
     g_nFound = 0;
     
     EnumWindows (  FindHwndFromPID,    ( LPARAM) dwProcessId));
     
     if ( g_hwnd)  // trouvé
          return ( g_hwnd);
     
     return (NULL);
    }
     
    BOOL CALLBACK FindHwndFromPID( HWND hwnd, LPARAM lParam)
    {
        DWORD   dwPID2Find  =   ( DWORD) lParam;
        DWORD   dwPID       =   0;
     
        if  (   GetWindowThreadProcessId    (   hwnd,   &dwPID))
            {
                if  (   dwPID   ==  dwPID2Find)
                    {
                        g_hwnd  =   hwnd;
     
     
                        return  (   FALSE);
                    }
            }
     
        return  (   TRUE);
    }
    vu que createprocess te retourner l'id du process

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    J'ai utilisé la 2ème solution avec FindHwndFromPID et ça marche.

    En revanche le SW_SHOWNORMAL, ne force pas la fenetre en premier plan.

    Merci pour ton aide précieuse.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/04/2013, 11h19
  2. Réponses: 5
    Dernier message: 15/10/2012, 17h19
  3. remettre l'aplication au premier plan
    Par Phonatacid dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 12/04/2009, 16h13
  4. Mettre fenêtre d'un exe au premier plan
    Par arn0caba2le dans le forum C++
    Réponses: 1
    Dernier message: 24/11/2007, 13h01
  5. forcer une fenetre à etre au premier plan jusqu'a ...
    Par peppena dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 22/12/2003, 17h14

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