Salut
Est ce que quelqu'un sait comment attendre qu'un processus soit entierement demarre?
Ce processus est lance par ShellExecute.
Merci
Salut
Est ce que quelqu'un sait comment attendre qu'un processus soit entierement demarre?
Ce processus est lance par ShellExecute.
Merci
tu peux detecter s'il est terminé, mais je pense pas qu'on puisse savoir s'il est entierement chargé, vu que ca dépend du processus.
Un processus (par ex word) n'emet pas un signal ou un truc pour dire qu'il est demarre
NonEnvoyé par pitch21
Sauf peut être en utilisant COM pour ouvrir tes documents WORD au lieu de shellExecute (c une supposition)
Je sais pas si c'est fort astucieux mais on peut pas utiliser le Create Process et apres utiliser la methode WaitForInputIdle???? Car il est dit dans la msdn :
The calling thread can use the WaitForInputIdle function to wait until the new process has finished its initialization and is waiting for user input with no input pending. This can be useful for synchronization between parent and child processes, because CreateProcess returns without waiting for the new process to finish its initialization. For example, the creating process would use WaitForInputIdle before trying to find a window associated with the new process.
Bon, je viens d'essayer ca, mais ca marche pas des masses ... je pense que c'est quand meme dépendant du process, et de sa facon de dire s'il est idle ou pas.
Avec Word, je peux pas trop essayer, ca se charge un peut trop vite pour voir...
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 STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); // Start the child process. if( !CreateProcess( NULL, "C:\\Program Files\\Microsoft Visual Studio .NET 2003\\Common7\\IDE\\devenv.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) ) { MessageBox(NULL,"CreateProcess raté","",MB_ICONSTOP); } WaitForInputIdle(pi.hProcess,INFINITE); MessageBox(NULL,"Chargé","",MB_ICONSTOP); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread );
J'ai essaye avec le ShellExecuteEx et j'ai donné le hprocess à la méthode WaitInputIdle avec comme toi le param INFINITE et c pas ce que j'attends. La methode debloque plus tot que tt soit initialise
Tu connais pas une autre méthode peut etre?
Helas ca debloque trop vite
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 SHELLEXECUTEINFO m_ShellExecuteInfo; memset(&m_ShellExecuteInfo, 0, sizeof(m_ShellExecuteInfo)); m_ShellExecuteInfo.cbSize = sizeof(m_ShellExecuteInfo); m_ShellExecuteInfo.fMask = SEE_MASK_NOCLOSEPROCESS; m_ShellExecuteInfo.hwnd = 0; m_ShellExecuteInfo.lpVerb = "open"; m_ShellExecuteInfo.lpFile = "C:/Program Files/Microsoft Visual Studio .NET 2003/Common7/IDE/devenv.exe"; m_ShellExecuteInfo.lpParameters = 0; m_ShellExecuteInfo.lpDirectory = 0; m_ShellExecuteInfo.nShow = SW_SHOW; m_ShellExecuteInfo.hInstApp = 0; ShellExecuteEx(&m_ShellExecuteInfo); WaitForInputIdle(m_ShellExecuteInfo.hProcess,INFINITE);
j'ai pas vraiment de solutions miracles, désolé. On peut peut-etre faire qqchose mais ca dépend de ton application.
J'ai vu rapidement que c'était pas word que tu voulais ouvrir, et si il y a une fenetre, tu peux essayer de faire un findwindow jusqu'à ce que tu trouves ta fenetre. Si c'est une application perso, c'est encore plus simple en envoyant un message dès que c'est initialisé.
Sinon, tu peux aussi d'essayer de hooker les créations de fenetres avec WH_SHELL ou bien WH_CBT.
j'ai peur que le titre de la fenetre soit initialisé avant que tt soit charge. En fait moi c'est un programme d'animation 3D que je lance et il faut que j'attende qu'il soit lance et surtout qu'il aye chargé entierement l'animation voulue. Helas ce logiciel n'est pas a moi donc je ne sais pas lui dire envoi un signal
regarde peut-etre du coté des hooks que je t'ai indiqué.
ou alors, si il y a une fenetre (genre barre d'outil) qui se lance à la fin, essaye de reperer sa classe avec spy++ pour faire un findwindow dessus
En fait je viens de tester le lancement du logiciel sans ouvrir d'animation et le méthode WaitForInputIdle detecte +/- bien quand elle est demarree mais donc elle est incapable de savoir si un chargement est termine.
Pour ce qui est de detecte une barre d'outil ou quoi bin j'en vois pas car tt est charge au demarrage et puis quand il y a chargement de l'animation, il n'y a rien qui change a part l'anim qui se met en place et de petit parametre par ci par la. Est ce suffisant?? Car je connais Spy++ juste de nom lol
j'essaierai de trouver un peu de temps cet aprem pour faire un essai avec un hook pour voir ce que ca donne. Je te tiendrai au courant
Je te remercie nico-pyright(c) , je ferai des tests aussi mais je fignole mon prog et puis je passe mon temps a ca.
Lut juste pour dire que le probleme a ete resolu par le fait que des que mon animation est lancee, j'envoi une note MIDI à mon programme pour qu'il puisse demarre. SInon j'ai tjs pas trouve d'autre moyen.
Salut
Tant mieux, j'avais fait rapidement des tests de mon coté, et ca n'avait guere été concluant...
a+
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager