Lancer une application

Signaler
Messages postés
4
Date d'inscription
dimanche 12 mars 2006
Statut
Membre
Dernière intervention
18 juillet 2007
-
Messages postés
4
Date d'inscription
dimanche 12 mars 2006
Statut
Membre
Dernière intervention
18 juillet 2007
-
Bonjour,
Je débute avec les MFC sous Visual C++, et j'ai crée une application SDI. J'aimerais lancer une application extérieure (.exe) en lui spécifiant une position et une dimension dans ma fenetre. Je ne sais pas si cela est possible, et si cette application peut rester au premier plan.

Merci d'avance

8 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Regarde le param STRATUPINFO de CreateProcess().

ciao...
BruNews, MVP VC++
Messages postés
4
Date d'inscription
dimanche 12 mars 2006
Statut
Membre
Dernière intervention
18 juillet 2007

Merci BruNews !

Je pense en effet que CreateProcess() va tout a fait convenir, mais j'ai encore un probleme :
voila mon code

bool ok;
STARTUPINFO lpStartUpInfo;

lpStartUpInfo.lpReserved=NULL;
lpStartUpInfo.lpReserved2=NULL;
lpStartUpInfo.lpDesktop=NULL;
lpStartUpInfo.lpTitle=NULL;

ok=CreateProcess( NULL,
"C:\\WINDOWS\\system32\\notepad.exe",
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&lpStartUpInfo,
&pi);
if(!ok) {
MessageBox(" Echec de CreateProcess ",0, MB_OK);
}

CreateProcess me retourne toujours FALSE.
En regardant d'un peu plus pres, peut etre que l'erreur provient deSTARTUPINFO. En effet, juste avant d'etre utilisée par CreateProcess(), 3 parametres lpReserved, lpReserved2 et Desktop sont en erreur.

Si vous avez une idée de l'endroit ou j'ai faux dans mon code, je suis preneur

Merci
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Régler membre dwFlags pour indiquer ceux concernés.
Lire MSDN qui explique tout cela.

ciao...
BruNews, MVP VC++
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Salut,

Conserver une fenêtre devant une autre, ça risque d'être difficile, qui plus est quand on ne code pas soi même la fenêtre qui est devant...

Y a le syle WS_EX_TOP_MOST et aussi HWND_TOPMOST qui ont certainement à peu près le même effet.

Le plus simple restant de faire des fenêtres ne se superposant pas, et de juste minimiser/restaurer l'appli que tu lance quand l'utilisateur minimise/restaure la tienne. Un peu comme ça quoi : on voit le bureau à travers.
Messages postés
4
Date d'inscription
dimanche 12 mars 2006
Statut
Membre
Dernière intervention
18 juillet 2007

Salut, merci pour vos réponses.
En fait, mon application sera utilisée à terme sans souris. De plus, je pars d'un projet existant.
Mon application VC++ utilise 2 écrans l'un au dessus de l'autre, et j'aimerais que dans une partie de mon écran supérieur, je puisse lancer une application extérieure et que celle-ci reste toujours visible (ne soit pas cachée par mon appli VC++).

Bien que j'ai réglé le dwflags à STARTF_USEPOSITION, CreateProcess retourne toujours FALSE.
Est ce que les différents arguments de CreateProcess vous paraissent approprié ?
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Quand tu as une erreur comme ça, tu peux récupérer le numéro de l'erreur avec GetlastError, et la description avec un FormatMessage (Ou utiliser Error Lockup m'enfin faut m'expliquer en quoi c'est mieux de faire le travail à la main)

Pour l'initialisation, tu as un indice un peu plus haut avec dwFlags.

Tout est expliqué dans la doc.

Un truc dans ce genre là je suppose :

// On met tout à zéro, ça facilite le travail car y a pas mal de reserved qui doivent être à zéro/NULL
ZeroMemory(&lpStartUpInfo, sizeof(lpStartUpInfo));

// La taille de la structure
lpStartUpInfo.cb = sizeof(lpStartUpInfo);

// Pour utiliser un des membre, il faut le préciser dans les flags
lpStartUpInfo.dwFlags = STARTF_USEPOSITION | STARTF_USESHOWWINDOW;

// Position du bord haut gauche de la fenêtre
lpStartUpInfo.dwX = 300;
lpStartUpInfo.dwY = 300;

// Style
lpStartUpInfo.wShowWindow = SW_SHOWNORMAL;

Pour afficher l'appli dans une fenêtre bien précise, il doit y avoir moyen, mais je sais pas comment.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
La msdn en parle ici.
(Y a pas que cette page bien sûr -> regarder l'arborescence à droite)

A ce que j'ai compris, y a pas moyen de faire du CreateProcess ou on sélectionne la fenêtre, mais les coodonnées d'ouverture de la fenêtre sont "unifiée". C'est comme si on avait un très grand écran quoi, et on peut spécifier dwX et dwY pour aller dans un screen précis. Pour connaitre les coordonnées d'une fenêtre dans un le grand rectangle, on peut utiliser les fonctions détaillées dans les références (cf mon lien plus haut). M'enfin dans ton cas, tu préfèrerat peut être les coder en dur (Ou dans un fichier ini...)
Messages postés
4
Date d'inscription
dimanche 12 mars 2006
Statut
Membre
Dernière intervention
18 juillet 2007

Désolé pour le retard !
Merci rt15, j'ai reussi à lancer l'application
Mais hélas, je n'ai pas trouvé le moyen de l'obligé à rester au premier plan.

Bonne continuation