[Resolu/VBA] Priorité des applications

Priorité des applications [Resolu/VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 01-06-2007 à 09:25:39    

Bonjour à tous,
voilà ma petite question je souhaite lancer un programme depuis une macro Excel/VBA, ç aje sais faire, mais je ne sais pas comment on peut régler la priorité de l'application (à savoir je souhaite la passer en below normal).
 
Quelqu'un sait-il comment faire ?
 
Merci
 
Benj


Message édité par merenptah44 le 06-06-2007 à 15:03:19
Reply

Marsh Posté le 01-06-2007 à 09:25:39   

Reply

Marsh Posté le 01-06-2007 à 10:27:52    

À part passer par des API Windows pour le lancement de ton programme je ne sais pas.
Genre l'API CreateProcessA() (c'est juste un exemple de ce qui me vient à l'esprit ; je ne suis pas sûr que ça irait pour ton besoin)

Reply

Marsh Posté le 01-06-2007 à 11:17:39    

Ok j'ai pas tout compris à ce que tu m'as dit
Je lance mon programme avec une petite routine comme ça :
(c pas de moi j'e l'ai récupéré, peut-être bien ici d'ailleurs)

Code :
  1. Public hProcess, nRet, Retour As Long
  2. Const PROCESS_QUERY_INFORMATION = &H400
  3. Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
  4. Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  5. Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
  6. Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
  7. Sub launch_orcaflex()
  8. ' Pour lancer le programme :
  9. Retour = Shell("C:\Program Files\Orcina\OrcaFlex\OrcaFlex.exe", 1)
  10. ' Pour Fermer le programme :
  11. hProcess = OpenProcess(fdwAccess, False, Retour)
  12. GetExitCodeProcess hProcess, nRet
  13. Call TerminateProcess(hProcess, nRet)
  14. Call CloseHandle(hProcess)
  15. End Sub


je me demande si ça serait pas en jouant sur  :Const PROCESS_QUERY_INFORMATION = &H400
mais j'en suis pas sur

Reply

Marsh Posté le 01-06-2007 à 11:20:24    

Bon à priori c ça :
Public Const BELOW_NORMAL_PRIORITY_CLASS = &H4000
et on peut utiliser la commande API (proche de ce que tu suggérait) :
SetPriorityClass  
 
j'ai fait ça mais c pas encore concluant :

Code :
  1. InRet = SetPriorityClass(hProcess, BELOW_NORMAL_PRIORITY_CLASS)


mais j'arrive pas à réutiliser InRet et la valeur, je vois pas où ça s'utilise encore...
 


Message édité par merenptah44 le 01-06-2007 à 11:28:41
Reply

Marsh Posté le 01-06-2007 à 11:38:55    

j'ai fait ça (enfin en utilisant un code glanés sur la toile):

Code :
  1. Public hProcess, nRet, Retour As Long
  2. Const PROCESS_QUERY_INFORMATION = &H400
  3. ' Constantes des priorités (6 niveaux de priorités)
  4. Public Const IDLE_PRIORITY_CLASS As Long = &H40 ' minimum
  5. Public Const BELOW_NORMAL_PRIORITY_CLASS As Long = &H4000 ' normal -
  6. Public Const NORMAL_PRIORITY_CLASS As Long = &H20 ' normal
  7. Public Const ABOVE_NORMAL_PRIORITY_CLASS As Long = &H8000 ' normal +
  8. Public Const HIGH_PRIORITY_CLASS As Long = &H80 ' haute
  9. Public Const REALTIME_PRIORITY_CLASS As Long = &H100 ' maximum
  10. '
  11. Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
  12. Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  13. Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
  14. Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
  15. Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
  16. ' Constante paramètre de l'API OpenProcess
  17. Private Const PROCESS_SET_INFORMATION As Long = &H200
  18. ' Defini la priorité d'un processus
  19. Public Function SetProcessPriority(ByVal ProcessID As Long, ByVal Level As Long)
  20.     Dim hProcess As Long
  21.     ' Ouvre en ecriture
  22.     hProcess = OpenProcess(PROCESS_SET_INFORMATION, 0, ProcessID)
  23.     ' On définit la priorité
  24.     SetPriorityClass hProcess, Level
  25.     ' On ferme le pointeur ouvert
  26.     CloseHandle hProcess
  27. End Function
  28. Sub launch_orcaflex()
  29. ' Pour lancer le programme :
  30. Level = BELOW_NORMAL_PRIORITY_CLASS
  31. Retour = Shell("C:\Program Files\Orcina\OrcaFlex\OrcaFlex.exe", 1)
  32. ' Pour Fermer le programme :
  33. hProcess = OpenProcess(fdwAccess, False, Retour)
  34. GetExitCodeProcess hProcess, nRet
  35. SetProcessPriority hProcess, Level
  36. Call CloseHandle(hProcess)
  37. End Sub


Mais ça marche pas plus
 
quid ? :??:


Message édité par merenptah44 le 01-06-2007 à 11:41:20
Reply

Marsh Posté le 01-06-2007 à 12:50:38    

N'ayant pas moi-même utilisé ces fonctions, je ne pouvais que t'indiquer la piste.
J'espère que quelqu'un d'autre pourra mieux te guider sur ce sujet.

Reply

Marsh Posté le 04-06-2007 à 15:57:56    

up

Reply

Marsh Posté le 04-06-2007 à 15:58:30    

question :  
aux connaisseurs est -ce que je veux faire est-il tout simplement faisable sous Windows 98 (ben quoi, c'est pas moi c'est le boulot)

Reply

Marsh Posté le 04-06-2007 à 16:06:16    

Je crains que les connaisseurs de ce genre de pratique (changer la priorité d'un programme) ne soient pas dans la catégorie VB :)
(p'ti up de soutien déguisé)

Reply

Marsh Posté le 04-06-2007 à 16:30:51    

tu dois avoir raison, jegarde espoir cela dit(un merci déguisé pour le soutient et le up accompagnant)


Message édité par merenptah44 le 04-06-2007 à 16:31:03
Reply

Marsh Posté le 04-06-2007 à 16:30:51   

Reply

Marsh Posté le 06-06-2007 à 11:38:01    

Reply

Marsh Posté le 06-06-2007 à 15:02:42    

ben en fait j'ai essayé ce qu'il disait mais bizarrement les commandes qqch.exe /HIGh ne sont pas reconnues quand tu fais SHELL en vba.
cela dit j'ai résolu qd m^me le pb, si un jour ça intéresse quelqu'un ce n'est peut etre pas le meilleur code mais ça marche

Code :
  1. Public hProcess, nRet, Retour As Long
  2. Const PROCESS_QUERY_INFORMATION = &H400
  3. ' Constantes des priorités (6 niveaux de priorités)
  4. Public Const IDLE_PRIORITY_CLASS As Long = &H40 ' minimum
  5. Public Const BELOW_NORMAL_PRIORITY_CLASS As Long = &H4000 ' normal -
  6. Public Const NORMAL_PRIORITY_CLASS As Long = &H20 ' normal
  7. Public Const ABOVE_NORMAL_PRIORITY_CLASS As Long = &H8000 ' normal +
  8. Public Const HIGH_PRIORITY_CLASS As Long = &H80 ' haute
  9. Public Const REALTIME_PRIORITY_CLASS As Long = &H100 ' maximum
  10. '
  11. Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
  12. Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  13. Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
  14. Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
  15. Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
  16. Declare Function GetCurrentProcessId Lib "kernel32" () As Long
  17. ' Constante paramètre de l'API OpenProcess
  18. Private Const PROCESS_SET_INFORMATION As Long = &H200
  19. Sub launch_orcaflex()
  20. ' Pour lancer le programme :
  21. Level = BELOW_NORMAL_PRIORITY_CLASS
  22. Retour = Shell("C:\Program Files\Orcina\OrcaFlex\OrcaFlex.exe ", 1)
  23. hProcess = OpenProcess(&H200, False, Retour)
  24. SetPriorityClass hProcess, Level
  25. Call CloseHandle(hProcess)
  26. End Sub


 
c quand même beau le web, comment a-t'on pu s'en passer  :bounce:  ?

Reply

Marsh Posté le 06-06-2007 à 15:20:43    

merenptah44 a écrit :


c quand même beau le web, comment a-t'on pu s'en passer  :bounce:  ?


 
[totalement  HS, mais pas tant que ca]
 un ancien sujet de philo :
"Est-on responsable de ce dont on a pas conscience ?" :sol:  
[/HS]

Reply

Marsh Posté le 06-06-2007 à 15:52:39    

En fait merenptah44, par rapport à ton premier essai tu as juste rétabli la bonne valeur de premier paramètre lors de l'appel à l'API OpenProcess() ?
À savoir tu as remplacé
hProcess = OpenProcess(fdwAccess, False, Retour)
par
hProcess = OpenProcess(&H200, False, Retour)
 
Or je remarque dans ton code qu'une constante semble être dédiée à cette utilisation.
Le code devrait donc être (pour être complet)
hProcess = OpenProcess(PROCESS_SET_INFORMATION, False, Retour)
 
Je ne pensais pas que ça pouvait être aussi simple en fait.
Bravo d'avoir gardé espoir :)

Reply

Marsh Posté le 06-06-2007 à 16:30:59    

tegu a écrit :

En fait merenptah44, par rapport à ton premier essai tu as juste rétabli la bonne valeur de premier paramètre lors de l'appel à l'API OpenProcess() ?
À savoir tu as remplacé
hProcess = OpenProcess(fdwAccess, False, Retour)
par
hProcess = OpenProcess(&H200, False, Retour)
 
Or je remarque dans ton code qu'une constante semble être dédiée à cette utilisation.
Le code devrait donc être (pour être complet)
hProcess = OpenProcess(PROCESS_SET_INFORMATION, False, Retour)
 
Je ne pensais pas que ça pouvait être aussi simple en fait.
Bravo d'avoir gardé espoir :)


en fait c exactement ça, je m'étais pas aperçu que j'avais viré la constante fdwaccess=PROCESS_SET_INFORMATION... y a des jours comme ça ...


---------------
Un pur groupe de musique à connaitre avant tout le monde :http://perso.numericable.fr/~bebrault/hollymess (site down pour le moment)
Reply

Sujets relatifs:

Leave a Replay

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