Lancer une application

Scuz Messages postés 4 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 18 juillet 2007 - 9 juil. 2007 à 19:08
Scuz Messages postés 4 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 18 juillet 2007 - 17 juil. 2007 à 13:51
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 juil. 2007 à 20:41
Regarde le param STRATUPINFO de CreateProcess().

ciao...
BruNews, MVP VC++
0
Scuz Messages postés 4 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 18 juillet 2007
10 juil. 2007 à 09:59
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 juil. 2007 à 10:12
Régler membre dwFlags pour indiquer ceux concernés.
Lire MSDN qui explique tout cela.

ciao...
BruNews, MVP VC++
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
10 juil. 2007 à 10:27
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Scuz Messages postés 4 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 18 juillet 2007
10 juil. 2007 à 11:17
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é ?
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
10 juil. 2007 à 12:30
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.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
10 juil. 2007 à 12:55
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...)
0
Scuz Messages postés 4 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 18 juillet 2007
17 juil. 2007 à 13:51
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
0
Rejoignez-nous