démarrer une appli externe

démarrer une appli externe - C++ - Programmation

Marsh Posté le 23-05-2004 à 16:13:44    

Bonjour à tous,
 
je suis autodidacte en C++ et MFC. Je vous dirais que je pige assez bien les concepts mais j'ai un gros problème de fil directeur si vous voyez ce que je veux dire...
Je fais un appli que s'initialise avec des fichiers ascii (donc éditables avec notepad, je précise que je tourne sous win xp). En cas d'erreur de format j'ai mis une boite de dialogue avec le nom du fichier et la ligne en question mais on voit vite les limites de cette solution en cas de gros fichier.
Comment faire pour lancer notepad avec le fichier en question???
si vous pouviez m'orienter dans la msdn ce serait sympa..
(ont-ils pondu le même genre de chose qu'en vbs??)
 
merci!!

Reply

Marsh Posté le 23-05-2004 à 16:13:44   

Reply

Marsh Posté le 23-05-2004 à 19:54:26    

J'ai déjà vu des logiciels lancer acrobat reader pour ouvrir un fichier pdf (ou word pour un doc..), cela me semble être plus ou moins la même chose, le but final étant de placer le curseur sur la ligne de l'erreur... (avec un nombre de WM_KEYDOWN correspondant à: (umero de la ligne - 1)

Reply

Marsh Posté le 23-05-2004 à 20:17:23    

ben ya shellexecute (simple) et createprocess (avancé) en win32, en mfc je sais pas

Reply

Marsh Posté le 23-05-2004 à 21:26:15    

Merci pour l'info, effectivement ça marche. Mais à quoi correspond cette HINSTANCE retourné, l'ID du process?? Y aurait-il moyen de récupérer quelquepart le handle de la fenêtre de notepad pour lui envoyer des WM_KEYDOWN (j'imagine, là aussi je découvre..)?

Reply

Marsh Posté le 24-05-2004 à 19:10:02    

Bon, vraisemblablement j'ai trouvé ce qu'il me faut: GetForegroundWindow(). Mais il paraît que c'est pas top... Vraiment personne n'a d'autre idée???

Reply

Marsh Posté le 24-05-2004 à 19:20:17    

je te conseille un super livre, si tu ne l'as pas déjà, c'est pas mal comme référence, pour se donner justement un point de vue un peu global sur la prog windows:
ca s'appelle "C/C++ la bible du programmeur", et c'est chez Eyrolles (gros pavé inside).
Il y a peut-être une seconde édition aujourd'hui, trouvable un peu partout, et spécialement dans les Furet.

Reply

Marsh Posté le 24-05-2004 à 19:58:19    

En fait c'est pas trop la prog sous windows qui me pose problème, ce serait plutot Windows lui-même... J'en suis à chercher comment récupérer le handle d'une fenetre d'un autre process, et ca a pas l'air d'etre du gateau..
Actuellement je teste avec ça:
 

Code :
  1. ShellExecute( this->m_hWnd,
  2.  NULL,
  3.  "C:\\WINDOWS\\NOTEPAD.EXE", // je répète, c'est un test..
  4.  pChemin, // chemin du fichier à éditer
  5.  NULL,
  6.  SW_SHOWDEFAULT);


 
Ca renvoie un int dont je n'ai que faire à part pour une éventuelle erreur!
Maintenant, comment récupérer le handle de la nouvelle fenêtre??
GetForegroundWindow() me renvoie pas celui que je veux...
FindWindow() je voudrais bien, en connaissant le nom de la classe de fenetre de Notepad..
Je continue de farfouiller la masse mais j'en tire pas grand chose..


Message édité par EuZah le 24-05-2004 à 20:15:10
Reply

Marsh Posté le 24-05-2004 à 21:08:50    

Ca y est!! j'ai trouvé:
suffisait de mettre un sleep!
 

Code :
  1. ShellExecute( this->m_hWnd,
  2.  NULL,
  3.  "C:\\WINDOWS\\NOTEPAD.EXE",
  4.  pChemin,
  5.  NULL,
  6.  SW_SHOWDEFAULT);
  7. Sleep(500);
  8. CWnd *Wnd = GetForegroundWindow();
  9. if(Wnd)
  10. {
  11. for(int i=0; i< 5; i++) // essai de décalage
  12. {
  13.  Wnd->PostMessage(WM_KEYDOWN, VK_DOWN);
  14.  Wnd->PostMessage(WM_KEYUP, VK_DOWN);
  15. }
  16. }


 
bon voilà mais sinon il a pas l'air de prendre en compte les WM_KEYDOWN... Comment ce peut-ce?

Reply

Marsh Posté le 24-05-2004 à 21:21:41    

ton truc pour récupérer la handle de la fenêtre me parait pas sur (si l'ordi et lent et beaucoup solicité, notepad aura peut-etre par créé sa fenetre au bout d'une demi-seconde) ...  
regarde avec CreateProcess pour obtenir un lien vers le processus créé, puis avec EnumWindow et GetWindowThreadProcessId pour retrouver celle qu'a créé ton processus
 
sinon, pourquoi ne te crées-tu pas toi-même ta fenêtre qui charge le fichier text dans une boite de texte ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 24-05-2004 à 21:42:33    

bon j'ai trouvé: remplacer
 
Wnd->PostMessage(WM_KEYDOWN, VK_DOWN);  
Wnd->PostMessage(WM_KEYUP, VK_DOWN);  
 
par:
 
keybd_event(VK_DOWN,0,0,0);
keybd_event(VK_DOWN,0,KEYEVENTF_KEYUP,0);
 
oui Black, j'y est pensé, mais je voulais faire un truc qui marche pour savoir si c'était possible.
-> Ca marche
De toutes façons, Notepad se lancerait juste après le lancement de mon appli, SI une erreur est rencontrée (j'ai pris 500 pour faire un test)
Sinon je sens que ça va encore une fois être la galère à assimiler les fonctions que tu m'indiques, qui admettent des pointeurs de CALLBACK étouétou... pffff... je suis pas rendu...


Message édité par EuZah le 24-05-2004 à 22:00:44
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed