Hi Francisco,
Thank you for your advice, it was very useful.
Here is the code I used to validate your proposal and it works well:
Test code :
long ll_ret
ll_Ret = w_principal.wf_Execute("C:\Windows\System32\calc.exe", '', "open", false)
messagebox("Calculatrice ouverte", "PID = " + string(ll_ret))
ll_Ret = w_principal.wf_Execute("C:\Windows\System32\taskkill.exe", "/PID" + string(ll_Ret), "", false)
messagebox("Fermeture de la calculatrice", ll_ret)
detail of wf_Execute function :
//////////////////////////////////////////////////////////////////////////////
//LANCEMENT D'UNE COMMANDE SHELL SUR UN FICHIER DONNE
//Renvoi : une valeur < 32 si erreur
// si ab_Wait=true alors on renvoie le handle de la fenêtre ouverte
// sinon on renvoie le handle du process de l'application
//////////////////////////////////////////////////////////////////////////////
CONSTANT long SEE_MASK_NOCLOSEPROCESS = 64
CONSTANT long INFINITE = 4294967295 //&HFFFFFFFF
string ls_Class
long ll_ret
long ll_Handle
struc_shellexecuteinfo lstruc_shellexecuteinfo
lstruc_shellexecuteinfo.cbsize = 60
lstruc_shellexecuteinfo.fMask = SEE_MASK_NOCLOSEPROCESS // Ne ferme pas le process
lstruc_shellexecuteinfo.lpVerb = as_commande
lstruc_shellexecuteinfo.lpParameters = as_Parametres
lstruc_shellexecuteinfo.lpfile = as_fichier
lstruc_shellexecuteinfo.lpClass = ls_class
lstruc_shellexecuteinfo.nShow = SW_NORMAL
ll_ret = ShellExecuteEx(lstruc_shellexecuteinfo)
IF ll_ret = 0 THEN
//Erreur lors du lancement
RETURN lstruc_shellexecuteinfo.hInstapp
END IF
//Vérifie si on souhaite attendre l'ouverture de l'application pour continuer
if ab_Wait then
//Attend que l'application lancée reprenne la main et soit prete a être utilisée
WaitForInputIdle(lstruc_shellexecuteinfo.hprocess, INFINITE)
//Récupération du handle de la fenêtre se trouvant au premier plan (celle-ci doit être la fenêtre de l'application)
ll_Handle = GetForegroundWindow()
//Récupère le parent de la fenêtre récupérée pour que l'on soit sûr d'avoir la fenêtre Main de l'application
ll_Handle = wf_GetParent(ll_Handle)
return ll_Handle
end if
//Retourne le handle du process
return lstruc_shellexecuteinfo.hProcess
Regards,
Francisco
The return of the Eexcute function corresponds to the Handle of the application and not to its PID.
So I wanted to use the CloseHandle(ll_handle) function. The CloseHandle function returns to me True but does not close the application.
Does anyone know why the application does not close or how to recover the PID of an application launched from the ShellExecuteEx function?
Thank you for your help